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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2212274
kferfred
Posté le 30-11-2013 à 23:17:38  profilanswer
 

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.

mood
Publicité
Posté le 30-11-2013 à 23:17:38  profilanswer
 

n°2212275
Farian
Posté le 30-11-2013 à 23:20:30  profilanswer
 

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
n°2212276
kferfred
Posté le 30-11-2013 à 23:25:47  profilanswer
 

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
n°2212278
Farian
Posté le 01-12-2013 à 00:16:32  profilanswer
 

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 !

n°2212855
Sve@r
Posté le 07-12-2013 à 13:27:17  profilanswer
 

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.

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

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

 

Sujets relatifs
Balise html pour fichier .g3w[C]Chaine qui ne s'affiche pas...
Batch + nom de fichiertélécharger et installer C++
C++ et procédure stockées MySqlRécupérer des données d'un fichier xml
Novice en langage C ! HELP![C] Tirage de lettre et probabilité
[C] Calculer la Normale d'un vecteur en CJava'sCool Ecrire dans un fichier.txt
Plus de sujets relatifs à : [C]Détection de fin de fichier...


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