pb de lecture dansun fichier

pb de lecture dansun fichier - C - Programmation

Marsh Posté le 22-03-2004 à 22:22:05    

salut
 
j'ai un pb de doublon à l'affichage. voila mon code :
 
FILE * fic ;
tCD leTab;
 
fic = fopen ("CDs.dat", "r" );
while (!feof(fic)){
 
fread(&leTab, sizeof (tCD),1,fic);
cout<<"L'identifiant du CD est :" << leTab.IdCD<<"\n";
cout<<"Le titre du CD est : " << leTab.Titre <<"\n";
cout<<"La date de sortie du CD est :"<<leTab.dateSortie<<"\n";
cout<<"Le commentaire sur le CD est :"<<leTab.commentaire<<"\n";
cout << " \n";

 
et donc si j'appelle cette fonction sur un fichier qui contient un seul enregistrement de ce type (le fichier est correct j'ai vérifié), il m'en affiche deux à la suite avant de quitter cette fonction. On dirait qu'il vapte mal la fin de fichier.
 
Si vous avez une suggestion.
merci beaucoup.

Reply

Marsh Posté le 22-03-2004 à 22:22:05   

Reply

Marsh Posté le 22-03-2004 à 22:24:23    

logique. while (!feof(fic)) est true car tu fais fread dans la première instruction. fais une trace ça te paraitras logique

Reply

Marsh Posté le 22-03-2004 à 22:27:53    

ignoble.
 
utilise les ifstream en binaire et voilà
http://cplusplus.com/ref/iostream/istream/read.html
 
 
le problèem c'est de toutes façons eof. eof ne dit pas si on est à la fin du fichier, mais si la dernière lecture a échouée à cause de eof.
 
donc on analyse ton programme
 
while(!eof) - ok, ça passe, le fichier vient d'etre ouvert
 
read - ok, on a lu le premier, le pointeur est en fin de fichier
 
while(!eof) - ok, on est en fin de fichier __mais__ aucune lecture infructueuse n'a été effectuée
 
read - échoue ... le contenu de tCD est le même que le dernier enregistrement puisqu'il n'est pas relu
 
while(!eof - voilà, ça termine
 
 
 
 
en bon programme ressemblera à
 
while(fichier.read(...))
{
  // traitement  
}

Reply

Marsh Posté le 22-03-2004 à 22:29:25    

JagStang a écrit :

logique. while (!feof(fic)) est true car tu fais fread dans la première instruction. fais une trace ça te paraitras logique

moi j'ai fait la version détaillée. seulement faut bien avoué que ce sujet est un exemple magistral de comment il ne faut pas utiliser feof sous peine de traiter 2 fois le dernier enregistrement

Reply

Marsh Posté le 22-03-2004 à 23:03:23    

et sans utiliser les ifstream y'a surement une solution ... en fait c pour un pot qui est en BTS info et il a pas encore fait tout ca ...  
merci

Reply

Marsh Posté le 22-03-2004 à 23:05:50    

c quoi une lecture infructueuse ??

Reply

Marsh Posté le 22-03-2004 à 23:06:05    

c quoi le problème d'utiliser les fstream ? si tu utilise cout, tu utilise déjà les stream. tu peux jouer avec cout.write si tu veux ou cin.read ... l'interface des stream est semblabe aux FILE*, ça s'utilise tout seul, et au moins c'est du C++, pas du C

Reply

Marsh Posté le 22-03-2004 à 23:07:24    

justement il a pas fait le c++ juste les flux cout cin

Reply

Marsh Posté le 22-03-2004 à 23:10:29    

ben oui mais je te dit que quand t'utilises cout/cin, c'est déjà des stream, alors ça change rien, just ouvrir le fichier, et même usage que partout.
 
stdio est FILE*, quand tu utilises stdio, ben tu sais déjà comment on utilise un FILE*

Reply

Sujets relatifs:

Leave a Replay

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