[C]Détection de fin de fichier...

Détection de fin de fichier... [C] - C - Programmation

Marsh Posté le 30-11-2013 à 23:17:38    

Salut !
Voila je dois lire dans un fichier différentes structures a la suite jusqu'a la fin du fichier, le problème c'est que ça m'affiche toujours la dernière structure deux fois !

Code :
  1. FILE* ptMem;
  2.     smartphone stockage;
  3.     int i=1;
  4.     ptMem=fopen(nomFich,"rb" );
  5.     if(ptMem==NULL){
  6.         printf("Erreur dans l'ouverture du fichier. Le programme va se fermer." );
  7.         exit(-1);
  8.     }
  9.     else{
  10.         do{
  11.             fread(&stockage, sizeof(smartphone), 1, ptMem);
  12.             printf("\n\tsmartphone numero %d :\n",i);
  13.             printf("Nom du modele : %s \n",stockage.modele);
  14.             printf("Portable de marque : " );
  15.             switch(stockage.numFabricant){
  16.                 case 1: printf("Samsung\n" );
  17.                     break;
  18.                 case 2: printf("LG\n" );
  19.                     break;
  20.                 case 3: printf("Apple\n" );
  21.                     break;
  22.                 case 4: printf("Nokia\n" );
  23.                     break;
  24.                 case 5: printf("Blackberry\n" );
  25.                     break;
  26.                 default: printf("####\n" );
  27.             }
  28.             printf("Poids de %d grammes\n",stockage.poids);
  29.             printf("Prix de %d Euros.\n",stockage.prix);
  30.             i++;
  31.             system("pause" );
  32.         }while(!feof(ptMem));


J'ai mis toute la fonction mais je sais que ça vient de mon feof(ptMem) à la dernière ligne, le problème c'est que je sais pas du tout comment détecter autrement la fin du fichier...
 
Voila en espérant que vous pourrez m'aider, merci de prendre de votre temps pour aider de pauvres étudiants comme moi :)
Bises.

Reply

Marsh Posté le 30-11-2013 à 23:17:38   

Reply

Marsh Posté le 30-11-2013 à 23:20:30    

Bonjour !
 
Testez le retour de fread, qui vous dit combien d'éléments ont été lus sur ceux que vous demandez (1, en l'occurrence).
 
Logiquement, au dernier appel, vous devriez avoir 0, et c'est justement cet appel-là qui déclenche le "feof", quand vous tentez de lire après la fin du fichier.
 
Et cela vous protège aussi contre une éventuelle structure incomplète.
 
Bonne continuation !


Message édité par Farian le 30-11-2013 à 23:24:13
Reply

Marsh Posté le 30-11-2013 à 23:25:47    

Je crois que je suis un peu bête mais je n'y arrive toujours pas !
 
Une petite démonstrations SVP ? :P
 
Merci.
 
EDIT : Quand j'affiche le nombre de blocs lus, il me dit 1 après que j'ai affiché la dernière structure du fichier !
 
EDIT 2 : au final j'ai fait comme ceci :  
 

Code :
  1. FILE* ptMem;
  2.     smartphone stockage;
  3.     int i=1,nbBlocs;
  4.     ptMem=fopen(nomFich,"rb" );
  5.     if(ptMem==NULL){
  6.         printf("Erreur dans l'ouverture du fichier. Le programme va se fermer." );
  7.         exit(-1);
  8.     }
  9.     else{
  10.         do{
  11.             nbBlocs=fread(&stockage, sizeof(smartphone), 1, ptMem);
  12.             if(nbBlocs==0)
  13.                 break;
  14.             printf("\nBlocs lus : %d\n",nbBlocs);
  15.             printf("\n\tsmartphone numero %d :\n",i);
  16.             printf("Nom du modele : %s \n",stockage.modele);
  17.             printf("Portable de marque : " );
  18.             switch(stockage.numFabricant){
  19.                 case 1: printf("Samsung\n" );
  20.                     break;
  21.                 case 2: printf("LG\n" );
  22.                     break;
  23.                 case 3: printf("Apple\n" );
  24.                     break;
  25.                 case 4: printf("Nokia\n" );
  26.                     break;
  27.                 case 5: printf("Blackberry\n" );
  28.                     break;
  29.                 default: printf("####\n" );
  30.             }
  31.             printf("Poids de %d grammes\n",stockage.poids);
  32.             printf("Prix de %d Euros.\n",stockage.prix);
  33.             i++;
  34.             system("pause" );
  35.         }while(1);
  36.     }
  37.     fclose(ptMem);


je sais pas si c'est le plus simple mais ça marche :)

Message cité 1 fois
Message édité par kferfred le 30-11-2013 à 23:41:00
Reply

Marsh Posté le 01-12-2013 à 00:16:32    

C'est pas mal.
 
En théorie, vous pouvez éventuellement tester feof et ferror, pour savoir si la lecture a échoué parce que vous êtes arrivé à la fin du fichier ou si il y a eu une erreur quelconque, mais tel quel, cela me parait assez correct.
 
Bonne continuation !

Reply

Marsh Posté le 07-12-2013 à 13:27:17    

kferfred a écrit :


Code :
  1. do{
  2.             nbBlocs=fread(&stockage, sizeof(smartphone), 1, ptMem);
  3.             if(nbBlocs==0)
  4.                 break;
  5.             ...
  6.         }while(1);
  7.     }


je sais pas si c'est le plus simple mais ça marche :)


Salut
Le plus simple

Code :
  1. while ((nbBlocs=fread(&stockage, sizeof(smartphone), 1, ptMem)) > 0){
  2.             ...
  3.         };
  4.     }


Parce que, contrairement aux idées reçues, feof() ne sert pas à détecter la fin de fichier mais à détecter, une fois que le fichier a été lu et que la fin de lecture a été détectée, si l'arrêt est dû à une fin de fichier ou autre (erreur IO, etc...)
Conclusion: si on utlise feof() pour détecter la fin de fichier, on la détecte un tour trop tard...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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