Petit problème étrange sur lecture de fichier

Petit problème étrange sur lecture de fichier - C - Programmation

Marsh Posté le 17-03-2004 à 21:46:31    

Je l'ai mis dans la catégorie C puisque ce n'en est pas pour les puristes.
 
Je dois lire un fichier de cette forme :
 

v 0.5 0 -0.5
v -0.5 0 -0.5
v -0.5 0 0.5
v 0.5 0 0.5
v 0 1 0
 
f 1 2 3 4
f 1 2 5
f 2 3 5
f 3 4 5
f 4 1 5


 
Et voilà ce que j'ai pour le moment :
 

Code :
  1. #include <iostream.h>
  2. #include <stdio.h>
  3. void main(void)
  4. {
  5. FILE *fichier;
  6. int valeurs,vertex=0,facette=0;
  7. char c;
  8.     float x,y,z;
  9. fichier=fopen("Pyramide.obj","rt" );
  10. do
  11. {
  12.  valeurs=fscanf(fichier,"%c %f %f %f\n",&c,&x,&y,&z);
  13.  if(c='v') // Si la ligne commence par "c"
  14.  {
  15.   cout<<c;
  16.   cout<<"\nVertex "<<vertex<<" :\n"<<flush;
  17.   vertex++;
  18.   cout<<"x="<<x<<" y="<<y<<" z="<<z<<endl<<flush;
  19.  }
  20.  else if(c='f') // Si la ligne commence par "f"
  21.  {
  22.   cout<<"\nFacette "<<facette<<" :\n"<<flush;
  23.   facette++;
  24.  }
  25. }
  26. while(!feof(fichier));
  27.     fclose(fichier);
  28. }


 
Donc dans mon idée, en fonction du premier caractère de la ligne, je sais quel genre de fscanf je dois effectuer. Ce problème concerne principalement les lignes commençant par "f" car elle peuvent avoir soit 3, soit 4 réels donc je pensais utiliser le retour de fscanf pour faire le tri.
 
Mon problème est déjà avant, ma variable c trouve toujours "v" en début de ligne !  [:mlc] Pourquoi ?
 
Merci, après avoir régler ce problème, je pourrai me pencher sur le fscanf propre au 2 situtations.


Message édité par Master_Jul le 17-03-2004 à 21:47:52
Reply

Marsh Posté le 17-03-2004 à 21:46:31   

Reply

Marsh Posté le 17-03-2004 à 21:50:51    

je donne mon avis ou pas ?
 
     if(c='v') // Si la ligne commence par  
 
 
t'es sur ce toi là ?

Reply

Marsh Posté le 17-03-2004 à 21:52:21    

Eh merde. :/ L'erreur de base. Merci.


Message édité par Master_Jul le 17-03-2004 à 21:53:13
Reply

Marsh Posté le 17-03-2004 à 22:03:21    

sinon ton C, ça te fait pas bizarre d'y mettre des cout et iostream ?

Reply

Marsh Posté le 17-03-2004 à 22:04:16    

et "rt" -> "r"
 
t n'existe pas, le mode par défaut est toujours le mode texte sauf, si on spécifie "b"

Reply

Marsh Posté le 17-03-2004 à 22:08:38    

Avec un nivo de warning + élevé, ton compilo t'aurait certainement mis la puce à l'oreille...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-03-2004 à 22:13:26    

Taz a écrit :

sinon ton C, ça te fait pas bizarre d'y mettre des cout et iostream ?


 
Comme je l'ai précisé au début du topic, je l'ai mis dans "C" parcequ'à part les cout, ce programme n'a rien du C++, ce sont les dires même des forumeurs de programmation lors de mon dernier topic posté malheureusment en C++
 
 
Et comme ça je suis conforme ?  
 

Code :
  1. #include <stdio.h>
  2. void main(void)
  3. {
  4. FILE *fichier;
  5. int valeurs,vertex=0,facette=0;
  6. char c;
  7.     float x,y,z,a;
  8. fichier=fopen("Pyramide.obj","r" );
  9. do
  10. {
  11.  valeurs=fscanf(fichier,"%c %f %f %f %f\n",&c,&x,&y,&z,&a);
  12.  if(c=='v') // Si la ligne commence par "c"
  13.  {
  14.   printf("\nVertex %i\n",vertex);
  15.   vertex++;
  16.   printf("x=%1.0f y=%1.0f z=%1.0f\n",x,y,z);
  17.  }
  18.  else if(c=='f') // Si la ligne commence par "f"
  19.  {
  20.   printf("\nFacette %i\n",facette);
  21.   facette++;
  22.   if(valeurs==5) printf("Points : %1.0f,%1.0f,%1.0f,%1.0f\n",x,y,z,a);
  23.   else printf("Points : %1.0f,%1.0f,%1.0f\n",x,y,z);
  24.  }
  25. }
  26. while(!feof(fichier));
  27.     fclose(fichier);
  28. }

Reply

Marsh Posté le 17-03-2004 à 22:21:35    

Citation :

if(c=='v') // Si la ligne commence par "c"


Par 'v' plutôt  ;)  
Ok, chipotage ...  :jap:

Reply

Marsh Posté le 17-03-2004 à 22:33:56    

non.
 
déjà rends toi bien compte ce qu'il y a d'incohérent à utiliser le C pour les entrées et le C++ pour les sorties
 
 
et le bon usage, c'est de stoper la boucle dès que ton valeurs est différent de 4 ou 5, pas de continuer et de voir si feof est là. si ton fichier est mal formé, ta boucle part en boucle infinie.

Reply

Marsh Posté le 17-03-2004 à 23:17:35    

En quoi j'utilisais le C pour les entrées ?
 
Pour le while il faudrait que je mette également 0 alors car le fscanf devrait renvoyer 0 sur la ligne vide non ?

Reply

Marsh Posté le 17-03-2004 à 23:17:35   

Reply

Marsh Posté le 17-03-2004 à 23:19:57    

J'en suis à ranger les valeurs trouvées dans des tableaux de structures, j'utilise des méthodes maison assez barbares du genre conversion de type qui ne sont surrement pas innocentes dans le déconnage du remplissage du tableau LesFacettes.
 

Code :
  1. #include <stdio.h>
  2. void main(void)
  3. {
  4. FILE *fichier;
  5. int valeurs,no_vertex=0,no_facette=0,i,j;
  6. char c;
  7.     float x,y,z,a;
  8. struct Vertex
  9. {
  10.  float x,y,z;
  11. };
  12. struct Facette
  13. {
  14.  Vertex Points[4];
  15.  int NbVertex;
  16. };
  17. Vertex LesVertex[5]; // la pyramide a 5 sommets
  18. Facette LesFacettes[5]; // la pyramide a 5 facettes
  19. fichier=fopen("Pyramide.obj","r" );
  20. do
  21. {
  22.  valeurs=fscanf(fichier,"%c %f %f %f %f\n",&c,&x,&y,&z,&a);
  23.  if(c=='v') // Si la ligne commence par "c"
  24.  {
  25.   printf("\nVertex %i\n",no_vertex);
  26.   printf("x=%1.1f y=%1.1f z=%1.1f\n",x,y,z);
  27.   LesVertex[no_vertex].x=x;
  28.   LesVertex[no_vertex].y=y;
  29.   LesVertex[no_vertex].z=z;
  30.   no_vertex++;
  31.  }
  32.  else if(c=='f') // Si la ligne commence par "f"
  33.  {
  34.   printf("\nFacette %i\n",no_facette);
  35.   if(valeurs==5)
  36.   {
  37.    printf("Points : %1.0f,%1.0f,%1.0f,%1.0f\n",x,y,z,a);
  38.    for(i=0;i<5;i++)
  39.    {
  40.     LesFacettes[no_facette].Points[i].x=LesVertex[int(x)-1].x;
  41.     LesFacettes[no_facette].Points[i].y=LesVertex[int(y)-1].y;
  42.     LesFacettes[no_facette].Points[i].z=LesVertex[int(z)-1].z;
  43.    };
  44.    LesFacettes[no_facette].NbVertex=valeurs-1;
  45.   }
  46.   else
  47.   {
  48.    printf("Points : %1.0f,%1.0f,%1.0f\n",x,y,z);
  49.    for(i=0;i<4;i++)
  50.    {
  51.     LesFacettes[no_facette].Points[i].x=LesVertex[int(x)-1].x;
  52.     LesFacettes[no_facette].Points[i].y=LesVertex[int(y)-1].y;
  53.     LesFacettes[no_facette].Points[i].z=LesVertex[int(z)-1].z;
  54.    };
  55.    LesFacettes[no_facette].NbVertex=valeurs-1;
  56.   }
  57.   no_facette++;
  58.  }
  59. }
  60. while(!feof(fichier));
  61.     fclose(fichier);
  62. // Lecture du contenu des tableaux :
  63. // Les vertex
  64. for(i=0;i<5;i++)
  65. {
  66.  printf("\nVertex %i (tableau) :\n",i);
  67.  printf("x=%1.1f,y=%1.1f,z=%1.1f\n",LesVertex[i].x,LesVertex[i].y,LesVertex[i].z);
  68. }
  69. // Les facettes
  70. for(i=0;i<5;i++)
  71. {
  72.  printf("\nFacette %i (tableau) :\n",i);
  73.  for(j=0;j<3;j++)
  74.   printf("Coordonnees : x=%1.1f,y=%1.1f,z=%1.1f\n",LesFacettes[i].Points[j].x,LesFacettes[i].Points[j].y,LesFacettes[i].Points[j].z);
  75.  printf("Nombre de facettes : %i\n",LesFacettes[i].NbVertex);
  76. }
  77. }


Message édité par Master_Jul le 17-03-2004 à 23:20:28
Reply

Marsh Posté le 18-03-2004 à 00:06:13    

Master_Jul a écrit :

En quoi j'utilisais le C pour les entrées ?


 
fscanf c'est quoi ?
 
[citation=676666,1][nom]Master_Jul a écrit[/nom
Pour le while il faudrait que je mette également 0 alors car le fscanf devrait renvoyer 0 sur la ligne vide non ?
[/citation]non. fscanf renvoie le nombre d'arguments correctement convertis. dans ton cas si c'est pas 4 ou 5, faut que tu t'arretes. ce qui n'est pas le cas. d'autant plus que fscanf peut bloquer sans que feof soit vrai. alors enlève ton do ... while feof, fais un for( ; ; ) { valeur= fscanf(); if (valeur < 4) { break; } else {traitement normal;} }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed