[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
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 ?

A voir également:

6 réponses

Bonjour

Peux-tu montrer le code ?
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
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
0
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.

#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;
}
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
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.

#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;
}
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 =\
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
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)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 837
18 août 2011 à 22:16
KX,
Pourquoi utiliser '\r' ? Simplement '\n' suffit avec fgetc.
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 837
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.
0
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 837
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.
0
Faute de frappe. Dans ma description au point 2, je voulais mettre soit '\r' partout, soit '\n' partout, mais pas mélanger.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 837
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.
0