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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1760430
fatloui
I'll be back
Posté le 16-07-2008 à 16:57:43  profilanswer
 

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
mood
Publicité
Posté le 16-07-2008 à 16:57:43  profilanswer
 

n°1760433
theshockwa​ve
I work at a firm named Koslow
Posté le 16-07-2008 à 17:02:56  profilanswer
 

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 !

n°1760485
Joel F
Real men use unique_ptr
Posté le 16-07-2008 à 18:39:33  profilanswer
 

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

n°1760540
Elmoricq
Modérateur
Posté le 16-07-2008 à 20:30:38  profilanswer
 

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
n°1760552
fatloui
I'll be back
Posté le 16-07-2008 à 20:56:29  profilanswer
 

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

n°1760566
Elmoricq
Modérateur
Posté le 16-07-2008 à 21:35:02  profilanswer
 

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/

n°1760593
fatloui
I'll be back
Posté le 16-07-2008 à 22:09:07  profilanswer
 

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

n°1760597
Taz
bisounours-codeur
Posté le 16-07-2008 à 22:24:45  profilanswer
 

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

n°1760598
tpierron
Posté le 16-07-2008 à 22:38:19  profilanswer
 

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. }

n°1760599
fatloui
I'll be back
Posté le 16-07-2008 à 22:39:10  profilanswer
 

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

mood
Publicité
Posté le 16-07-2008 à 22:39:10  profilanswer
 

n°1760600
fatloui
I'll be back
Posté le 16-07-2008 à 22:40:25  profilanswer
 

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

n°1760605
Gf4x3443
Killing perfection
Posté le 16-07-2008 à 23:14:26  profilanswer
 

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
n°1760668
Joel F
Real men use unique_ptr
Posté le 17-07-2008 à 09:05:00  profilanswer
 

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

n°1760710
fatloui
I'll be back
Posté le 17-07-2008 à 10:37:14  profilanswer
 

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)

n°1761057
theshockwa​ve
I work at a firm named Koslow
Posté le 17-07-2008 à 20:07:03  profilanswer
 

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

n°1761256
fatloui
I'll be back
Posté le 18-07-2008 à 09:40:43  profilanswer
 

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: )

n°1761303
Taz
bisounours-codeur
Posté le 18-07-2008 à 10:54:40  profilanswer
 

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.

n°1761339
theshockwa​ve
I work at a firm named Koslow
Posté le 18-07-2008 à 11:23:13  profilanswer
 

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 ? :)

n°1761413
Taz
bisounours-codeur
Posté le 18-07-2008 à 12:44:51  profilanswer
 

nan je papotte juste.

n°1761647
theshockwa​ve
I work at a firm named Koslow
Posté le 18-07-2008 à 15:47:03  profilanswer
 

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.

n°1761670
fatloui
I'll be back
Posté le 18-07-2008 à 16:08:54  profilanswer
 

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
n°1761683
tpierron
Posté le 18-07-2008 à 16:31:47  profilanswer
 

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.

n°1761684
sankukai8
Posté le 18-07-2008 à 16:32:48  profilanswer
 

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/

n°1761708
Taz
bisounours-codeur
Posté le 18-07-2008 à 17:16:14  profilanswer
 

man fgetc

n°1761775
fatloui
I'll be back
Posté le 18-07-2008 à 20:52:08  profilanswer
 

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

n°1761806
Elmoricq
Modérateur
Posté le 18-07-2008 à 21:52:21  profilanswer
 

fatloui a écrit :

j'etais tellement pressée d'avoir raison


 
[:quardelitre][:ratal]

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
[C] Manipulation de chaines dans un fichier[Résolu]Problème de requête SELECT
Indicer les lignes d'un fichier texte avec C++[Resolu] asp.net/C#/SQl server2005 affichage resultats recherche
Extraire lignes d'un fichier .csv avec Visual C++[Résolu][XSLT] Utilisation de la librairie redirect
Textarea et retour à la ligne[Résolu] XSLT : grouper et sommer
[C] Operand incorect . 
Plus de sujets relatifs à : [Résolu][C]condition de sortie d'une boucle while = retour chariot


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