[C] Lire les caractère d'une ligne fichier
Pseudo....
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je voudrais faire une boucle avec un fgetc dedans pour lire chaque caractère d'une ligne d'un fichier et les traiter un par un,
j'ai tenté de faire while(car != '\n') mais ça me fait une boucle infini (je fais bien car = fgetc(stream); après, donc le caractère change)
Pouvez vous me dire comment je pourrais faire mon while ?
Je voudrais faire une boucle avec un fgetc dedans pour lire chaque caractère d'une ligne d'un fichier et les traiter un par un,
j'ai tenté de faire while(car != '\n') mais ça me fait une boucle infini (je fais bien car = fgetc(stream); après, donc le caractère change)
Pouvez vous me dire comment je pourrais faire mon while ?
A voir également:
- [C] Lire les caractère d'une ligne fichier
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire fichier epub - Guide
- Fichier bin - Guide
- Caractère ascii - Guide
- Fichier rar - Guide
6 réponses
Tu peux trouver un exemple complet ici : fgectc
Tu devras remplacer while (c != EOF) par while (c!= '\n')
Remarque : sur Windows le saut de ligne est une combinaison de \r et de \n
La confiance n'exclut pas le contrôle
Tu devras remplacer while (c != EOF) par while (c!= '\n')
Remarque : sur Windows le saut de ligne est une combinaison de \r et de \n
La confiance n'exclut pas le contrôle
Voici le code :
Le but est de compter le nombre de voyelle par ligne dans un texte donné, et la boucle qui parcourt la ligne fait une boucle infinie parce que on ne trouve jamais le caractère de retour à la ligne.
Le but est de compter le nombre de voyelle par ligne dans un texte donné, et la boucle qui parcourt la ligne fait une boucle infinie parce que on ne trouve jamais le caractère de retour à la ligne.
#include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { FILE *stream = NULL; int i, car; stream = fopen ("test.txt.txt", "r"); if (stream == NULL) { perror ("The following error occurred"); system ("PAUSE"); return 0; } car = fgetc (stream); while (car != EOF) { while (car != '\r\n') { car = fgetc (stream); if (car == 'a' || car == 'e' || car == 'i' || car == 'o' || car == 'u' || car == 'y') i++; } printf("%d", i); i = 0; } fclose(stream); system("PAUSE"); return 0; }
Peut-être que ton fichier ne contient aucun saut de ligne, c'est à dire qu'il contient une ligne et se termine sans passer sur une deuxième ligne. Tu peux faire comme ceci :
Remarque : \r et \n sont deux caractères différents, donc '\r\n' n'existe pas.
Remarque : \r et \n sont deux caractères différents, donc '\r\n' n'existe pas.
#include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { FILE *stream = fopen ("D:\\test.txt", "r"); if (stream == NULL) { printf("Erreur d'ouverture\n"); system ("PAUSE"); return 1; } int i=0, car='\0'; while (car != EOF && car != '\r' && car != '\n') { car = fgetc (stream); switch (car) { case 'a' : case 'e' : case 'i' : case 'o' : case 'u' : case 'y' : i++; break; } } fclose(stream); printf("%d\n", i); system("PAUSE"); return 0; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Si si mon fichier contient des retours à la lignes je les ai fait moi même avec la touche "entrée" donc c'est bon, mais je pense que le caractère '\n' n'est pas le bon, je ne sais pas =\
Regarde mon code, il marche c'est sûr ^^
La grosse différence par rapport au tien c'est d'utiliser une seule boucle while
En effet avec deux boucles while comme ceci, tu es obligé de terminer ton fichier par un saut de ligne, alors qu'avec une seule boucle tu t'arretes soit sur un saut de ligne '\r' (mac ou windows) '\n' (linux ou windows) soir sur la fin du fichier (EOF)
La grosse différence par rapport au tien c'est d'utiliser une seule boucle while
En effet avec deux boucles while comme ceci, tu es obligé de terminer ton fichier par un saut de ligne, alors qu'avec une seule boucle tu t'arretes soit sur un saut de ligne '\r' (mac ou windows) '\n' (linux ou windows) soir sur la fin du fichier (EOF)
1 - ton while (car != '\r\n') ne devrait pas passer en compilation, car si '\r' et '\n' sont bien deux caractères en C, '\r\n' est une erreur de syntaxe.
2 - c'est norrmal que ça boucle.
Dans ton 'while' intérieur, tu lis jusqu'à ce que car soit égal à' \r' . Tu quittes cette boucle intérieure, tu retombes sur le while (car != EOF) : ok, on continue puisque car vaut '\n', il ne vaut pas EOF
Mais là, on retombe sur while (car != '\n') sans avoir lu aucun nouveau caractère. donc on n'entre pas dans la boucle. Et on ne lit jamais la suite du fichier, on reste sur le '\n' qui a été lu
Selon moi
- tu ne devrais pas faire car = fgetc (stream); avant d'entrer dans le premier while, car le premier caractère du fichier est ainsi totalement perdu
- tu devrais faire des boucles do {... } while(...) plutôt que while(...) {...} pour être sûr de toujours rentrer dans la boucle
2 - c'est norrmal que ça boucle.
Dans ton 'while' intérieur, tu lis jusqu'à ce que car soit égal à' \r' . Tu quittes cette boucle intérieure, tu retombes sur le while (car != EOF) : ok, on continue puisque car vaut '\n', il ne vaut pas EOF
Mais là, on retombe sur while (car != '\n') sans avoir lu aucun nouveau caractère. donc on n'entre pas dans la boucle. Et on ne lit jamais la suite du fichier, on reste sur le '\n' qui a été lu
Selon moi
- tu ne devrais pas faire car = fgetc (stream); avant d'entrer dans le premier while, car le premier caractère du fichier est ainsi totalement perdu
- tu devrais faire des boucles do {... } while(...) plutôt que while(...) {...} pour être sûr de toujours rentrer dans la boucle