[Résolu][C]condition de sortie d'une boucle while = retour chariot

condition de sortie d'une boucle while = retour chariot [Résolu][C] - C - Programmation

Marsh Posté le 16-07-2008 à 16:57:43    

Bonjour,
 
Je viens à nouveau solliciter l'aide des HFRiens.
 
Je lis les characteres d'un fichier et je souhaite m'arreter au retour chariot
 

Code :
  1. while(temp[i]!= 13)
  2.                       {
  3.                       temp[i]=fgetc(fichier);
  4.                       }


 
mais ca ne fonctionne pas et je comprend pas pourquoi.
 
temp est un char * et le code ascii du retour chariot est bien 13
pi etre que le C ne prend pas en compte le retour chariot mais j'ai rien trouver à ce sujet.
 
Merci pour vos reponses


Message édité par fatloui le 09-07-2009 à 16:01:57
Reply

Marsh Posté le 16-07-2008 à 16:57:43   

Reply

Marsh Posté le 16-07-2008 à 17:02:56    

Tu ne testes pas le cas où tu atteindrais la fin de fichier ? 13, ca ressemble à un nombre magique, il s'avère que c'est un '\r' et non pas un '\n' ... donc compare à '\n', ce sera plus lisible !

Reply

Marsh Posté le 16-07-2008 à 18:39:33    

et pourquoi lire caractére par caractère alors que getline marche très bien :[

Reply

Marsh Posté le 16-07-2008 à 20:30:38    

Parce qu'on est en C et que getline c'est du C++ [:dawa]

 

Par contre on peut utiliser fgets() qui, effectivement, fait ça très bien. [:dawa]

Message cité 1 fois
Message édité par Elmoricq le 16-07-2008 à 20:31:03
Reply

Marsh Posté le 16-07-2008 à 20:56:29    

le probleme c'est que fgets s'arrete à l'espace.
 
Le fichier que je li et de la forme
23/01/2333 blablabla             12         14
blibliblibli                          fjrfhr         rfiojr
24/01/2333 blablabla             12         14
blibliblibli                          fjrfhr         rfiojr

Reply

Marsh Posté le 16-07-2008 à 21:35:02    

fatloui a écrit :

le probleme c'est que fgets s'arrete à l'espace.


Nope. La fonction fgets() s'arrête soit à la fin d'une ligne, soit lorsque le buffer que tu lui as donné est plein. Si la fonction s'arrête "à un espace" c'est que le buffer que tu lui as donné est plein à ce moment-là.
http://www.manpagez.com/man/3/fgets/

Reply

Marsh Posté le 16-07-2008 à 22:09:07    

Je vois pas comment utiliser le fgets sans avoir le nombre de caracteres à lire.
mais j'ai tester avec le /n au lieu du /r car c'etait effectivement juste un retour à la ligne et non pas un retour chariot
(je savais pas que c'etait pas la meme chose)
 
Sinon voila le code complet, peut etre que ca vous parlera plus
maintenant j'ai un probleme car je veux lire les 10ers caracteres et que parfois il y en a moins de 10 (cad 9 suivis d'un espace)
que puis je faire?

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char **argv)
  4. {
  5.      FILE *fichier;
  6.      FILE *fichier2;
  7.      char temp[100];
  8.      char temp2[10];
  9.      long taille_fichier;
  10.      int i=0;
  11.      int j=0;
  12.      int cpt=0;
  13.    
  14.      //ouverture du fichier
  15.      fichier = fopen("test2.txt", "r" );
  16.    
  17.      //ouverture et création du fichier de sortie
  18.      fichier2 = fopen("Resultat.txt","w+" );
  19.    
  20.    
  21.    
  22.      do
  23.      {
  24.               printf("i = %d et le cpt = %d   \n ",i,cpt);
  25.              
  26.               //lire tout les caracteres
  27.               temp[i] = fgetc(fichier);
  28.              
  29.                       printf("temp =%c\n",temp[i]);
  30.               //si on rencontre un / (dans la date), on incremente le compteur
  31.               if (temp[i] == '/') cpt++;
  32.              
  33.               //si on a rencontré 2 '/' (en esperant qu'il y en a que dans la date)
  34.               if (cpt == 2)
  35.               {
  36.                       //on reinisialise le compteur
  37.                       cpt=0;
  38.                       //on "saute" les trois caracteres suivants
  39.                       fgetc(fichier);
  40.                       fgetc(fichier);
  41.                       fgetc(fichier);
  42.                       //on sauvegarde les dix caracteres suivants (numero de bordereau)
  43.                       for(j=0;j<10;j++)
  44.                       {
  45.                       temp2[j]=fgetc(fichier);
  46.                       printf("%c",temp2[j]);
  47.                       }
  48.                       //on l'ecrit dans le nouveau fichier
  49.                       for(j=0;j<10;j++)
  50.                       {
  51.                       fputc(temp2[j],fichier2);
  52.                       }
  53.                       //on ajoute le separateur (;)
  54.                       fputc(';',fichier2);
  55.                       //on avance jusqu'au retour à la ligne
  56.                       while(temp[i]!= '\n')
  57.                       {
  58.                       printf("\ntest\n" );
  59.                       temp[i]=fgetc(fichier);
  60.                       }
  61.                       //on enregistre les 10ers caracteres de la ligne suivante
  62.                       for(j=0;j<10;j++)
  63.                       temp2[j]=fgetc(fichier);
  64.                       //on l'ecrit dans le nouveau fichier
  65.                       fputs(temp2,fichier2);
  66.                       fputc('/n',fichier2);
  67.               }
  68.      j=i;
  69.      i++;
  70.      }while(temp[j]!=EOF);
  71.    
  72.      system("pause" );
  73.      fclose(fichier);
  74.      fclose(fichier2);
  75.      return EXIT_SUCCESS;
  76.    
  77. }


 
Merci pour vos réponses

Reply

Marsh Posté le 16-07-2008 à 22:24:45    

mauvais code.
 
int c;
 
while ((c = fgetc(...)) != EOF) {
  if (c == 'x') ...
}

Reply

Marsh Posté le 16-07-2008 à 22:38:19    

Oué, avec scanf() c'est un peu plus lisible ....
 

Code :
  1. #include <stdio.h>
  2. int main(int nb, char * argv[])
  3. {
  4.     FILE * in = fopen(argv[1], "r" );
  5.     char   buf[512];
  6.     if (in == NULL) { perror(argv[1]); return 1; }
  7.     while (fgets(buf, sizeof buf, in))
  8.     {
  9.         int y, m, d;
  10.         char code[11];
  11.         if (sscanf(buf, "%d/%d/%d %10s %*d %*d", &d, &m, &y, code) >= 4)
  12.         {
  13.             if (fgets(buf, sizeof buf, in))
  14.             {
  15.                 buf[10] = 0;
  16.                 fprintf(stdout, "code = %s, truc = %s\n", code, buf);
  17.             }
  18.         }
  19.     }
  20.     fclose(in);
  21.     return 0;
  22. }

Reply

Marsh Posté le 16-07-2008 à 22:39:10    

Ok merci.
 
JE sais pas pourquoi j'y avais pas pensé :s:s:s
 
Merci pour vos reponses

Reply

Marsh Posté le 16-07-2008 à 22:39:10   

Reply

Marsh Posté le 16-07-2008 à 22:40:25    

fscanf s'arrete à l'espace (la j'en suis sur :p)
 
et fgets doit connaitre le nombre de caracteres

Reply

Marsh Posté le 16-07-2008 à 23:14:26    

fatloui a écrit :

fscanf s'arrete à l'espace (la j'en suis sur :p)

 

Raté, les scanfs s'arrêtent au pattern que tu rentres. D'ailleurs, c'est pour ca qu'on évite les %s dedans (sauf à spécifier leur taille, ce que fait tpierron)

 
fatloui a écrit :

et fgets doit connaitre le nombre de caracteres

 

Non, c'est l'appelant qui doit spécifier une taille. fgets ne devine rien. Rien n'empeche d'ailleurs de l'appeler récursivement jusqu'à obtenir une ligne de taille très grande, c'est fait pour. A toi de gérer ton buffer de manière adéquate.


Message édité par Gf4x3443 le 16-07-2008 à 23:15:24
Reply

Marsh Posté le 17-07-2008 à 09:05:00    

Elmoricq a écrit :

Parce qu'on est en C et que getline c'est du C++ [:dawa]
 
Par contre on peut utiliser fgets() qui, effectivement, fait ça très bien. [:dawa]


 
crap  :fou: j'y étais presque :o

Reply

Marsh Posté le 17-07-2008 à 10:37:14    

Merci pour votre aide.
 
Je met mon code tout beau qui fonctionne bien si ca peut aider quelqu'un
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char **argv)
  4. {
  5.      FILE *fichier;
  6.      FILE *fichier2;
  7.      char temp[10];
  8.      char c=0;
  9.      int i=0;
  10.      int cpt=0;
  11.    
  12.      //ouverture du fichier
  13.      fichier = fopen("fff.txt", "r" );
  14.    
  15.      //ouverture et création du fichier de sortie
  16.      fichier2 = fopen("Resultat.txt","w+" );
  17.    
  18.    
  19.    
  20.      while(c!=EOF)
  21.      {
  22.               //on lit le premier caractere
  23.               c=fgetc(fichier);
  24.               //si on rencontre un / (dans la date), on incremente le compteur
  25.               if (c == '/') cpt++;
  26.              
  27.               //si on a rencontré 2 '/' (en esperant qu'il y en a que dans la date)
  28.               if (cpt == 2)
  29.               {
  30.                       //on reinisialise le compteur
  31.                       cpt=0;
  32.                       //on "saute" les trois caracteres suivants
  33.                       fgetc(fichier);
  34.                       fgetc(fichier);
  35.                       fgetc(fichier);
  36.                       //on sauvegarde les dix caracteres suivants (numero de bordereau)
  37.                       //et on l'ecrit dans un nouveau fichier
  38.                       for(i=0;i<10;i++)
  39.                       {
  40.                       temp[i]=fgetc(fichier);
  41.                       fputc(temp[i],fichier2);
  42.                       }
  43.                       //on ajoute le separateur (;)
  44.                       fputc(';',fichier2);
  45.                       //on avance jusqu'au retour à la ligne
  46.                       while(c!= '\n')
  47.                       {
  48.                       c=fgetc(fichier);
  49.                       }
  50.                       //on saute les 3 espaces
  51.                       fgetc(fichier);
  52.                       fgetc(fichier);
  53.                       fgetc(fichier);                     
  54.                       //on enregistre les 10ers caracteres de la ligne suivante
  55.                       //et on les ecrit dans le fichier
  56.                       for(i=0;i<10;i++)
  57.                       {
  58.                       temp[i]=fgetc(fichier);
  59.                       fputc(temp[i],fichier2);
  60.                       }
  61.                       //on saute une ligne dans le fichier
  62.                       fputc('\n',fichier2);
  63.                       } 
  64.      }
  65.      system("pause" );
  66.      fclose(fichier);
  67.      fclose(fichier2);
  68.      return EXIT_SUCCESS;
  69.    
  70. }


 
(meme si je pense que vu sa specificité ca aidera pas grand monde)

Reply

Marsh Posté le 17-07-2008 à 20:07:03    

Tu n'as pas lu tous les commentaires ...
Vérifie le type de retour de fgetc ...
lorsque fgetc te renvoie EOF, tu fais un tour de boucle avec une donnée invalide

Reply

Marsh Posté le 18-07-2008 à 09:40:43    

theshockwave a écrit :

Tu n'as pas lu tous les commentaires ...


 
euh... ah bon?  :heink:  
 

theshockwave a écrit :

Vérifie le type de retour de fgetc ...
lorsque fgetc te renvoie EOF, tu fais un tour de boucle avec une donnée invalide


 
Oki j'avais pas fait gaffe, merci ! :hello:  
(j'étais trop pressé que ca marche  :sarcastic: )

Reply

Marsh Posté le 18-07-2008 à 10:54:40    

theshockwave a écrit :

Tu n'as pas lu tous les commentaires ...
Vérifie le type de retour de fgetc ...
lorsque fgetc te renvoie EOF, tu fais un tour de boucle avec une donnée invalide


Je comprends pas la nature pessimiste des gens, toujours vouloir d'abord tester une fin de fichier avant de lire quoique ce soit.
 
C'est pourtant simple: tu lis encore et encore, et si ça fait un EOF, bah tu gères.
Faire l'inverse, ça me fait penser à l'histoire du démineur belge.

Reply

Marsh Posté le 18-07-2008 à 11:23:13    

Taz a écrit :


Je comprends pas la nature pessimiste des gens, toujours vouloir d'abord tester une fin de fichier avant de lire quoique ce soit.
 
C'est pourtant simple: tu lis encore et encore, et si ça fait un EOF, bah tu gères.
Faire l'inverse, ça me fait penser à l'histoire du démineur belge.


C'est mon message qui est en réponse, mais ta réponse s'adresse à fatloui, c'est ca ? :)

Reply

Marsh Posté le 18-07-2008 à 12:44:51    

nan je papotte juste.

Reply

Marsh Posté le 18-07-2008 à 15:47:03    

oui, parce que je suis d'accord avec toi, le but de ma remarque plus haut était de lui faire mettre le c=fgetc(fichier); dans la condition du while comme tu l'avais suggéré plus haut ...
 
J'en profite pour remettre une couche sur le fait que fgetc retourne un int et que le dernier code suggéré par fatloui le colle toujours dans un char, ce qui n'est toujours pas correct.

Reply

Marsh Posté le 18-07-2008 à 16:08:54    

J'ai fait ca pour ne pas avoir de decalage dans ma lecture de fichier
et certainement pas parce que je lis pas les post. Regarde la différence entre mon code avant et apres et tu verra que j'y ai tenu compte.
 
De plus non le fgetc renvoi un char et non pas un int :
http://doc.domainepublic.net/php/d [...] fgetc.html
 

Message cité 2 fois
Message édité par fatloui le 18-07-2008 à 16:10:20
Reply

Marsh Posté le 18-07-2008 à 16:31:47    

fatloui a écrit :

De plus non le fgetc renvoi un char et non pas un int :
http://doc.domainepublic.net/php/d [...] fgetc.html


 
[:pingouino] Mais heu, c'est la doc de php que tu montres là. Ton programme est en langage C, et en C, ça retournes un int.

Reply

Marsh Posté le 18-07-2008 à 16:32:48    

fatloui a écrit :

J'ai fait ca pour ne pas avoir de decalage dans ma lecture de fichier
et certainement pas parce que je lis pas les post. Regarde la différence entre mon code avant et apres et tu verra que j'y ai tenu compte.
 
De plus non le fgetc renvoi un char et non pas un int :
http://doc.domainepublic.net/php/d [...] fgetc.html
 


c'est une description pour la fonction en php!
 regarde ici:
http://nicolasj.developpez.com/articles/erreurs/

Reply

Marsh Posté le 18-07-2008 à 17:16:14    

man fgetc

Reply

Marsh Posté le 18-07-2008 à 20:52:08    

otan pour moi :p
j'etais tellement pressée d'avoir raison que j'ai ouvert la premiere page

Reply

Marsh Posté le 18-07-2008 à 21:52:21    

fatloui a écrit :

j'etais tellement pressée d'avoir raison


 
[:quardelitre][:ratal]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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