[C] Lire les caractère d'une ligne fichier
Fermé
Pseudo....
-
18 août 2011 à 16:13
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 août 2011 à 08:38
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 août 2011 à 08:38
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
- Caractère ascii - Guide
- Fichier rar - Guide
- Lire fichier bin - Guide
6 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 18/08/2011 à 16:18
Modifié par KX le 18/08/2011 à 16:18
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; }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
18 août 2011 à 17:05
18 août 2011 à 17:05
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 =\
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
18 août 2011 à 18:29
18 août 2011 à 18:29
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)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 août 2011 à 22:16
18 août 2011 à 22:16
KX,
Pourquoi utiliser '\r' ? Simplement '\n' suffit avec fgetc.
Pourquoi utiliser '\r' ? Simplement '\n' suffit avec fgetc.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
18 août 2011 à 22:32
18 août 2011 à 22:32
Au départ c'était juste une remarque, mais comme dans son code Pseudo avait mis '\r\n' je l'ai décomposé en deux avec un && mais c'est vrai que d'habitude je n'utilise que \n
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 août 2011 à 23:01
18 août 2011 à 23:01
Ah ok, j'avoue que j'ai pas lu tout le fil (flemme quand tu nous tiens ^^).
Et tu as raison de n'utiliser que le '\n' avec fgetc. Quel que soit l'OS, fgetc renverra '\n' pour les fins de ligne.
Et tu as raison de n'utiliser que le '\n' avec fgetc. Quel que soit l'OS, fgetc renverra '\n' pour les fins de ligne.
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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
19 août 2011 à 06:28
19 août 2011 à 06:28
Exact. Mais pas besoin de s'embêter avec \r. On aura toujours \n pour une fin de ligne.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
19 août 2011 à 08:38
19 août 2011 à 08:38
Ok pour '\n', mais si tu mets des '\r', ça ne marchera pas... fgetc renverra '\n' pour la fin de ligne.