Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1314 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Petit problème étrange sur lecture de fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petit problème étrange sur lecture de fichier

n°676583
Master_Jul
Posté le 17-03-2004 à 21:46:31  profilanswer
 

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
mood
Publicité
Posté le 17-03-2004 à 21:46:31  profilanswer
 

n°676586
Taz
bisounours-codeur
Posté le 17-03-2004 à 21:50:51  profilanswer
 

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

n°676588
Master_Jul
Posté le 17-03-2004 à 21:52:21  profilanswer
 

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


Message édité par Master_Jul le 17-03-2004 à 21:53:13
n°676604
Taz
bisounours-codeur
Posté le 17-03-2004 à 22:03:21  profilanswer
 

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

n°676605
Taz
bisounours-codeur
Posté le 17-03-2004 à 22:04:16  profilanswer
 

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

n°676608
HelloWorld
Salut tout le monde!
Posté le 17-03-2004 à 22:08:38  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°676611
Master_Jul
Posté le 17-03-2004 à 22:13:26  profilanswer
 

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. }

n°676618
cricri_
Posté le 17-03-2004 à 22:21:35  profilanswer
 

Citation :

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


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

n°676630
Taz
bisounours-codeur
Posté le 17-03-2004 à 22:33:56  profilanswer
 

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.

n°676666
Master_Jul
Posté le 17-03-2004 à 23:17:35  profilanswer
 

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 ?

mood
Publicité
Posté le 17-03-2004 à 23:17:35  profilanswer
 

n°676668
Master_Jul
Posté le 17-03-2004 à 23:19:57  profilanswer
 

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
n°676699
Taz
bisounours-codeur
Posté le 18-03-2004 à 00:06:13  profilanswer
 

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;} }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Petit problème étrange sur lecture de fichier

 

Sujets relatifs
lire un fichier avec XSLComment modifier un fichier texte a partir d'un programme
probleme avec les variables de sessionProblème avec les 'keys' d'un map de la STL
enregistrement automatque d'un fichier .xls (vba)probleme avec le nom des checkbox....
[ORACLE] Comment charger un fichier texte dans une table ?création d'un fichier XMl avec MSXML
boite de dialogue pb: sélection automatique de fichier(s)[Perl] probleme avec sub - subroutine [résolu -> howto inside]
Plus de sujets relatifs à : Petit problème étrange sur lecture de fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR