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

  FORUM HardWare.fr
  Programmation
  C

  [C] fgets ne marche qu'une fois...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] fgets ne marche qu'une fois...

n°1458084
kaloskagat​os
Posté le 16-10-2006 à 15:42:49  profilanswer
 

Bonjour,
 
J'ouvre un fichier texte avec FILE*streamFile = fopen(fileName,"r" ),  
 
je lis ligne par ligne avec fgets != NULL
 
et quand c'est fini je ferme le fichier fclose(streamFile)
 
Tout se passe bien une fois.
 
 
Si je repasse le même nom de fichier, fgets renvoie NULL direct...
 
J'ai essayé de faire:
 
      rewind(streamFile);
ou
      fseek(streamFile,SEEK_SET,0);
 
après l'ouverture du fichier mais ça ne change rien. Tête dans le guidon je vois pas ce qui cloche... Merci d'avance.

Message cité 1 fois
Message édité par kaloskagatos le 16-10-2006 à 16:41:35
mood
Publicité
Posté le 16-10-2006 à 15:42:49  profilanswer
 

n°1458132
kaloskagat​os
Posté le 16-10-2006 à 16:33:51  profilanswer
 

J'ai codé le truc en c++ avec des ifstream et des std::getline et j'ai le même problème...
 

n°1458146
Chaos Inte​stinal
Posté le 16-10-2006 à 16:44:27  profilanswer
 

Pourrais tu nous mettre le code pertinent en entier (entre balises [cpp])

n°1458159
kaloskagat​os
Posté le 16-10-2006 à 16:51:10  profilanswer
 

J'aurais dû faire ça tout de suite oui...  
 
 

Code :
  1. CHAINE ligne;
  2. CHAINE word;
  3.  
  4.   FILE *streamFile = NULL;
  5.   streamFile = fopen(fileName, "r" );
  6.  
  7.   if ( streamFile > 0 )
  8.   {
  9. //rewind(streamFile);
  10. //fseek(streamFile,SEEK_SET,0);
  11.  
  12. while( fgets(ligne, MAXLEN, streamFile) != NULL )
  13. {
  14.   //traitement de ligne
  15. }
  16.    }
  17.   else
  18.     {
  19.       error = -1;
  20.       sprintf(errorMessage,"Can't open Chimera Mask file (%s)",fileName);
  21.     }
  22.   fclose(streamFile);


 
la première fois que j'ouvre le fichier je rentre dans le while, si j'ouvre à nouveau le fichier fgets renvoie NULL tout de suite, même avec rewind ou fseek.
 
je précise typedef char CHAINE[MAXLEN];

Message cité 1 fois
Message édité par kaloskagatos le 16-10-2006 à 16:58:49
n°1458195
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-10-2006 à 17:23:52  profilanswer
 

kaloskagatos a écrit :


J'ouvre un fichier texte avec FILE*streamFile = fopen(fileName,"r" ),  
je lis ligne par ligne avec fgets != NULL
et quand c'est fini je ferme le fichier fclose(streamFile)
Tout se passe bien une fois.


OK.

Citation :

Si je repasse le même nom de fichier, fgets renvoie NULL direct...


Je ne connais pas de fonction 'repasse()'. Montre ce code là.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1458208
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-10-2006 à 17:30:37  profilanswer
 

kaloskagatos a écrit :


la première fois que j'ouvre le fichier je rentre dans le while, si j'ouvre à nouveau le fichier fgets renvoie NULL tout de suite, même avec rewind ou fseek.


Code :
  1. typedef char CHAINE[MAXLEN];
  2. /* -ed- c'est quoi MAXLEN ? */
  3. CHAINE ligne;
  4. CHAINE word;
  5. /* -ed- c'est quoi CHAINE ? */
  6.  
  7.   FILE *streamFile = NULL;
  8.   streamFile = fopen(fileName, "r" );
  9. /* -ed-  
  10.   if ( streamFile > 0 )
  11. atypique, mais correct. Je prefere   
  12. */
  13.   if ( streamFile != NULL )
  14.   {
  15. while( fgets(ligne, MAXLEN, streamFile) != NULL )
  16. {
  17.   //traitement de ligne
  18. }
  19.      /*  -ed- deplace */
  20.      fclose(streamFile);
  21.    }
  22.   else
  23.     {
  24.       error = -1;
  25.       sprintf(errorMessage,"Can't open Chimera Mask file (%s)",fileName);
  26.     }
  27. /* -ed- mal place  
  28.   fclose(streamFile);
  29. */


Essaye ça, c'est plus clair.
 
Si le défaut persiste, explique plus précisément ce qui se passe. Tu appelles 2 fois ce code ? Il est 2 fois dans ton programme ? Tu appelle deux fois le programme qui contient ce code ? J'ai du mal à saisir les circonstantes du problème signalé.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1458235
kaloskagat​os
Posté le 16-10-2006 à 17:52:02  profilanswer
 

Emmanuel Delahaye a écrit :


Je ne connais pas de fonction 'repasse()'. Montre ce code là.


 
Salut,
 
J'appelle deux fois ce code avec le même nom de fichier (pendant la même exécution du programme). J'ai une fenêtre Motif dans laquelle je renseigne le "const char* fileName" qui est en paramètre de la fonction et ce code est appelé pour lire le fichier.
 
 
J'ai modifié le code comme tu me l'as proposé mais le comportement est le même, j'arrive à ouvrir/lire/fermer un fichier texte mais quand je rappelle cette fonction le fichier est bien ouvert (streamFile != NULL) mais fgets(ligne, MAXLEN, streamFile) == NULL  
 
Le problème ne se produit que lorsque c'est le même fichier qu'on ouvre d'affilé, si ce sont deux fichier différents les deux sont correctement lus !
 
Par ailleurs : #define MAXLEN 1024

n°1458350
kaloskagat​os
Posté le 16-10-2006 à 21:14:07  profilanswer
 

up !


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
n°1458388
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-10-2006 à 22:35:10  profilanswer
 


Je n'ai aucun problème avec ce code :  (appelé n fois, peu importe)

Code :
  1. #include <stdio.h>
  2. #define MAXLEN 1024
  3. int main (void)
  4. {
  5.    int error = 0;
  6.    static char const fileName[] = "xxx.txt";
  7.    FILE *streamFile = fopen (fileName, "r" );
  8.    if (streamFile != NULL)
  9.    {
  10.       char ligne[MAXLEN];
  11.       while (fgets (ligne, sizeof ligne, streamFile) != NULL)
  12.       {
  13.          //traitement de ligne
  14.          printf ("%s", ligne);
  15.       }
  16.       fclose (streamFile);
  17.    }
  18.    else
  19.    {
  20.       error = -1;
  21.       fprintf (stderr, "Can't open Chimera Mask file (%s)", fileName);
  22.    }
  23.    return 0;
  24. }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1458559
kaloskagat​os
Posté le 17-10-2006 à 10:22:17  profilanswer
 

Merci pour ton aide, j'aurais du faire un petit programme de test comme ça, c'est au niveau de la récupération du nom de fichier la deuxième fois que mon code avait un problème, je considérais le nom du répertoire et non le fichier lui-même...
 
Pardon de t'avoir fair perdre un peu de temps :/
 
Si tu repasses par là, peux-tu me dire pourquoi tu écris static char const fileName[] = "xxx.txt"; avec static et char const dans ce sens? Merci :)

mood
Publicité
Posté le 17-10-2006 à 10:22:17  profilanswer
 

n°1458575
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-10-2006 à 10:54:10  profilanswer
 

kaloskagatos a écrit :

Si tu repasses par là, peux-tu me dire pourquoi tu écris static char const fileName[] = "xxx.txt"; avec static et char const dans ce sens ?


Euh, quel sens ? char et const sont commutatifs...
 
Sinon, le choix de ce codage est un vieux reflexe de codeur C pour l'embarqué. "Un byte est un byte".
 
static char const fileName[] = "xxx.txt"
-> Une zone de code contenant : {'x','x','x','.','t','x','t',0}
 
char const fileName[] = "xxx.txt"
static char fileName[] = "xxx.txt"
-> Une zone de code contenant : {'x','x','x','.','t','x','t',0}
-> Une zone de donnée  : tableau de 8 char
-> Du code de recopie
 
static char const *fileName = "xxx.txt"
static char *fileName = "xxx.txt" (risque d'erreur)
char const *fileName = "xxx.txt"
char *fileName = "xxx.txt" (risque d'erreur)
-> Une zone de code contenant : {'x','x','x','.','t','x','t',0}
-> Une zone de donnée  : un pointeur vers cette zone de code.


Message édité par Emmanuel Delahaye le 17-10-2006 à 10:54:39

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1458592
kaloskagat​os
Posté le 17-10-2006 à 11:15:41  profilanswer
 

Ok je vois un peu mieux, je vais creuser un peu plus.
 
A+

n°1458631
squall2023
Posté le 17-10-2006 à 11:46:23  profilanswer
 

Bon tout est bien qui fini bien, mais tout ça car tu t'étais planté dans le nom du fichier ... Sérieux, essaie de réfléchir avant de poster, merci.

n°1458636
Chaos Inte​stinal
Posté le 17-10-2006 à 11:50:05  profilanswer
 

squall2023 a écrit :

Bon tout est bien qui fini bien, mais tout ça car tu t'étais planté dans le nom du fichier ... Sérieux, essaie de réfléchir avant de poster, merci.


 
T'es qui toi ? [:mlc]


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

  [C] fgets ne marche qu'une fois...

 

Sujets relatifs
[] Afficher un msg que si le prog est executé pour la 1ére fois...Avis aux flasheurs experts // comment ca marche PreviewCity
[C++] fgets et sscanf[Résolu]Client/serveur qui marche qu'en local
[C++] "typage dynamique" marche pasboost::bind, pourquoi this ne marche pas?
page appelée plusieurs fois au lieu d'uneCapturer 2 evenements utilisateurs à la fois?
Architecture pc : comment ca marche l'adressage des ports ISA ?votez 2007 comment ça marche ?
Plus de sujets relatifs à : [C] fgets ne marche qu'une fois...


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