Ce forum est maintenant fermé, seule cette archive statique reste consultable.
  FORUM Rue-Montgallet.com
  Programmation
  C - C++

  c++ fichier binaire structure tableau

Bas de page
Auteur Sujet :

c++ fichier binaire structure tableau

n°19731
cedm237
Profil : Jeune recrue
Posté le 12-02-2010 à 23:06:07  
 

Bonjour,
En gros, j'essaie de faire ceci:
lire depuis un fichier binaire, des coordonées X Y Z, et 4 chiffres A B C F.
ces data appartiennent toutes à la grille ayant pour coin inférieur [Xmin,Ymin] et coin supérieur [xmax,Ymax], on partitionne la grille en grille plus petite, les datas qui sont dans une meme sous-grille sont barycentrées pour le XYZ, additionnées pour ABCF.
 
j'ai écris ceci, le debug est ok, mais visual studio 2008 me renvoi des messages de corruption mémoire, peut des mallocs ou des calloc? je sais pas trop, c'est clair je suis pas une star en programmation.
 
bon, voici the code, merci à tous pour votre aide:  

Code :
  1. // VC7.cpp*: définit le point d'entrée pour l'application console.
  2. //
  3. /clr
  4. #include "stdafx.h"
  5. #include <fstream>
  6. #include <iomanip>
  7. #include <iostream>
  8. #include <cstring>
  9. #include "stdio.h"
  10. #include "stdlib.h"
  11. #include <vcclr.h>
  12. #include <vector>
  13. //#include <string>
  14. using namespace std;
  15. using namespace System;
  16. FILE *fp1;
  17. //string ^str;
  18. std::string;
  19. //System::String^ str;
  20. //Variable
  21. char * prt_info2;
  22. int i,nb_step_Y,nb_step_X,j,k,cc,dd,n;
  23. long recl,lenr,numf,numx,numy;
  24. float xmin,xmax,ymin,ymax;
  25. struct info{
  26. float *X;
  27. float *Y;
  28. float *Z;
  29. float *A;
  30. float *B;
  31. float *C;
  32. float *F;
  33. };
  34. info info2,bar,juju;
  35. int main()
  36. {
  37. String ^str;
  38. int num_rec = 0;
  39. pin_ptr<const wchar_t> wch = PtrToStringChars(str);
  40. // Convert to a char*
  41. size_t origsize = wcslen(wch) + 1;
  42. const size_t newsize = 1000;
  43. size_t convertedChars = 0;
  44. char nstring[newsize];
  45. wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
  46. //strcat_s(nstring, " (char *)" );
  47. errno_t err;
  48. //Read from data file
  49. if((err=fopen_s(&fp1,"C:\\Sample\\project2DAT.dat","rb" ))!=0)
  50. fread(&recl,sizeof(recl),1,fp1);
  51. lenr=recl/256/4;
  52. fseek(fp1,28+24,0);
  53. fread(&numf,sizeof(numf),1,fp1);
  54. fseek(fp1,3*28+16,0);
  55. fread(&ymin,4,1,fp1);
  56. fread(&ymax,4,1,fp1);
  57. fread(&numy,4,1,fp1);
  58. fseek(fp1,4*28+16,0);
  59. fread(&xmin,4,1,fp1);
  60. fread(&xmax,4,1,fp1);
  61. fread(&numx,4,1,fp1);
  62. for (long i=0;i<2;i++)
  63. {
  64. fread(&info2.X[i],4,1,fp1);
  65. fread(&info2.Y[i],4,1,fp1);
  66. fread(&info2.Z[i],4,1,fp1);
  67. fread(&info2.A[i],4,1,fp1);
  68. fread(&info2.B[i],4,1,fp1);
  69. fread(&info2.C[i],4,1,fp1);
  70. fread(&info2.F[i],4,1,fp1);
  71. }
  72. fclose(fp1);
  73. //build the step for smaller grid
  74. nb_step_Y=(int)ymax-(int)ymin;
  75. nb_step_X=(int)xmax-(int)xmin;
  76. //build the array with the lines by smaller grid
  77. cc=0;
  78. for (long j=0;j<nb_step_Y;j++)
  79. {
  80.     for (long k=0;k<nb_step_X;k++)
  81.         {
  82.          cc=cc+1;
  83.          dd=0;
  84.       for (i=0;i<numx;i++)
  85.           {
  86.            if ((xmin-0.5*k < info2.X[i] < xmin+0.5*k)&&(ymin-0.5*j < info2.Y[i] < ymin+0.5*j))
  87.            dd=dd+1;
  88.            juju.X[dd]=info2.X[i];
  89.            juju.Y[dd]=info2.Y[i];
  90.            juju.Z[dd]=info2.Z[i];
  91.            juju.A[dd]=info2.A[i];
  92.            juju.B[dd]=info2.B[i];
  93.            juju.C[dd]=info2.C[i];
  94.            juju.F[dd]=info2.F[i];
  95.                  for (cc=1;cc<dd;cc++)
  96.                      {
  97.                       n=k*j;
  98.                       bar.X[n] = juju.X[cc];
  99.                       bar.Y[n] = juju.Y[cc];
  100.                       bar.Z[n] = juju.Z[cc];
  101.                       bar.A[n] = juju.A[cc];
  102.                       bar.B[n] = juju.B[cc];
  103.                       bar.C[n] = juju.C[cc];
  104.                       bar.F[n] = juju.F[cc];
  105.                      };
  106.                   bar.X[n] = bar.X[n]/dd;
  107.                   bar.Y[n] = bar.Y[n]/dd;
  108.                   bar.Z[n] = bar.Z[n]/dd;
  109.           };
  110.         };
  111. };
  112. // recording of result in file txt
  113. FILE* fichier = NULL;
  114. fichier = fopen("C:\\Sample\\donnees.txt", "a+" );
  115. if (fichier != NULL)
  116. {
  117.   fputs("Récapitulatif :\n", fichier);
  118.   for (cc=1;cc<dd;cc++)
  119.    {
  120.     fprintf(fichier, "*", bar.X[cc], "*", bar.Y[cc], "*", bar.Z[cc], "*", bar.A[cc], "*", bar.B[cc], "*", bar.C[cc], "*", bar.F[cc]);
  121.    }
  122.   fclose(fichier); // On ferme le fichier qui a été ouvert
  123.   cout << "writing is ok\n";
  124. }
  125. else
  126. {
  127. // errror  
  128.   printf("Impossible to open the file" );
  129. }
  130. system("pause" );
  131. return 0;
  132. };

mood
Pub
Posté le 12-02-2010 à 23:06:07  
 

n°19737
cmoila
Profil : Membre
Posté le 14-02-2010 à 22:00:16  
 

Commence déjà par écrire comme ça  :
(sans les pointeurs que tu n'affectes jamais)
 
struct info {  
   float X, Y, Z ;
   float A, B, C, F ;
};
 
FILE fp1;

n°19738
cedm237
Profil : Jeune recrue
Posté le 14-02-2010 à 22:14:25  
 

ok, mais comment je syntaxe le remplissage de ma structure vers la ligne 78 dans la boucle?

n°19739
cedm237
Profil : Jeune recrue
Posté le 15-02-2010 à 16:00:41  
 

j'ai suivi les conseils précédent, j'ai une erreur en release, corruption memory
 

Code :
  1. // VC8.cpp*: définit le point d'entrée pour l'application console.
  2. //
  3. /clr
  4. #include "stdafx.h"
  5. #include <fstream>
  6. #include <iomanip>
  7. #include <iostream>
  8. #include <cstring>
  9. #include "stdio.h"
  10. #include "stdlib.h"
  11. #include <vcclr.h>
  12. #include <vector>
  13. using namespace std;
  14. using namespace System;
  15. FILE *fp1;
  16. std::string;
  17. //Variable
  18. int i,nb_step_X,nb_step_Y,nb_step_Z,j,k,cc,dd,n;
  19. long recl,lenr,numf,numx,numy;
  20. float xmin,xmax,ymin,ymax,zmin,zmax;
  21. struct inf2 {
  22. float X, Y, Z ;
  23. float A, B, C, F ;
  24. }info2[10000000];
  25. struct ba2 {
  26. float X, Y, Z ;
  27. float A, B, C, F ;
  28. }bar2[10000000];
  29. struct juj2 {
  30. float X, Y, Z ;
  31. float A, B, C, F ;
  32. }juju2[10000000];
  33. int precision = 1; //mm
  34. int main()
  35. {
  36. String ^str;
  37. int num_rec = 0;
  38. pin_ptr<const wchar_t> wch = PtrToStringChars(str);
  39. // Convert to a char*
  40. size_t origsize = wcslen(wch) + 1;
  41. const size_t newsize = 1000;
  42. size_t convertedChars = 0;
  43. char nstring[newsize];
  44. wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
  45. //strcat_s(nstring, " (char *)" );
  46. errno_t err;
  47. //Read from data file
  48. if((err=fopen_s(&fp1,"C:\\Sample\\project2DAT.dat","rb" ))!=0)
  49. //fread(&recl,sizeof(recl),1,fp1);
  50. //lenr=recl/256/4;
  51. fseek(fp1,28+24,0);
  52. fread(&numf,sizeof(numf),1,fp1);
  53. fseek(fp1,3*28+16,0);
  54. fread(&ymin,4,1,fp1);
  55. fread(&ymax,4,1,fp1);
  56. fread(&numy,4,1,fp1);
  57. fseek(fp1,4*28+16,0);
  58. fread(&xmin,4,1,fp1);
  59. fread(&xmax,4,1,fp1);
  60. fread(&numx,4,1,fp1);
  61. for (long i=0;i<2;i++)
  62. {
  63. fread(&info2[i].X,4,1,fp1);
  64. fread(&info2[i].Y,4,1,fp1);
  65. fread(&info2[i].Z,4,1,fp1);
  66. if (zmax < (info2[i].Z))
  67.      { 
  68.       zmax= info2[i].Z;
  69.      }
  70. if (zmin > (info2[i].Z))
  71.      {
  72.       zmin= info2[i].Z;
  73.      }
  74. fread(&info2[i].A,4,1,fp1);
  75. fread(&info2[i].B,4,1,fp1);
  76. fread(&info2[i].C,4,1,fp1);
  77. fread(&info2[i].F,4,1,fp1);
  78. }
  79. fclose(fp1);
  80. //build the step for smaller grid
  81. nb_step_Y=((int)ymax-(int)ymin)/precision;
  82. nb_step_X=((int)xmax-(int)xmin)/precision;
  83. nb_step_Z=((int)zmax-(int)zmin)/precision;
  84. //build the array with the lines by smaller grid
  85. cc=0;
  86. n=0;
  87. for (long j=0;j<nb_step_Y;j++)
  88. {
  89.     for (long k=0;k<nb_step_X;k++)
  90. {
  91.   for (long l=0;k<nb_step_Z;l++)
  92.         {
  93.          cc=cc+1;
  94.          dd=0;
  95.       for (i=0;i<numx;i++)
  96.           {
  97.            if ((xmin-0.5*k < info2[i].X < xmin+0.5*k)&&(ymin-0.5*j < info2[i].Y < ymin+0.5*j)&& (zmin-0.5*l < info2[i].Z < zmin+0.5*l))
  98.            {
  99.            juju2[dd].X=info2[i].X;
  100.            juju2[dd].Y=info2[i].Y;
  101.            juju2[dd].Z=info2[i].Z;
  102.            juju2[dd].A=info2[i].A;
  103.            juju2[dd].B=info2[i].B;
  104.            juju2[dd].C=info2[i].C;
  105.            juju2[dd].F=info2[i].F;
  106.            dd=dd+1;
  107.                  for (cc=0;cc<dd;cc++)
  108.                      {
  109.                       bar2[n].X = bar2[n].X+juju2[cc].X;
  110.                       bar2[n].Y = bar2[n].Y+juju2[cc].Y;
  111.                       bar2[n].Z = bar2[n].Z+juju2[cc].Z;
  112.                       bar2[n].A = bar2[n].A+juju2[cc].A;
  113.                       bar2[n].B = bar2[n].B+juju2[cc].B;
  114.                       bar2[n].C = bar2[n].C+juju2[cc].C;
  115.                       bar2[n].F = bar2[n].F+juju2[cc].F;
  116.                      };
  117.                   bar2[n].X = bar2[n].X/dd;
  118.                   bar2[n].Y = bar2[n].Y/dd;
  119.                   bar2[n].Z = bar2[n].Z/dd;
  120.      n=n+1;
  121.           };
  122.         };
  123.        };
  124. };
  125. };
  126. // recording of result in file txt
  127. FILE* fichier = NULL;
  128. fichier = fopen("C:\\Sample\\donnees.txt", "a+" );
  129. if (fichier != NULL)
  130. {
  131.   fputs("Récapitulatif :\n", fichier);
  132.   for (cc=1;cc<dd;cc++)
  133.    {
  134.     fprintf(fichier, "*", bar2[cc].X, "*", bar2[cc].Y, "*", bar2[cc].Z, "*", bar2[cc].A, "*", bar2[cc].B, "*", bar2[cc].C, "*", bar2[cc].F);
  135.    }
  136.   fclose(fichier); // On ferme le fichier qui a été ouvert
  137.   cout << "writing is ok\n";
  138. }
  139. else
  140. {
  141. // errror  
  142.   printf("Impossible to open the file" );
  143. }
  144. system("pause" );
  145. return 0;
  146. };

n°19740
cmoila
Profil : Membre
Posté le 17-02-2010 à 16:19:29  
 

si ca passe pas ligne 77 etc mets des parenthèses.
 
fread(&(info2[i].X),4,1,fp1);   // fread(&info2[i].X,4,1,fp1);

  FORUM Rue-Montgallet.com
  Programmation
  C - C++

  c++ fichier binaire structure tableau

© 2000-2024 Forum.rue-montgallet.com - Tous droits réservés