IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

lecture d'un fichier charactère par charactère et test sur le charactère


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut lecture d'un fichier charactère par charactère et test sur le charactère
    bonjour j'aimerais ouvrir un fichier et faire sa lecture charactere par caractere
    et ensuite faire un test sur chaque caractere

    voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
     
    FILE *fp;
     
    void main (void)
    {
     
    	char line;
     
     
           	fp =fopen("lab.txt", "r");
            if (fp == NULL)
                    printf("Fichier introuvable\n");
            else
            {
                    while ( line=fgetc(fp)  != EOF )
                    {
     
                            if ( line == 'M')
                            {
                                    printf("gros mur\n");
                            }
     
                            // b majuscule
                            else if (line == 'B' )
                            {
                                    printf("super bonus\n");
                            }
     
                            // b minus
                            else if (line == 'b' )
                            {
                                    printf("bonus\n");
                            }
    	else if (line  == '\n' )
    			{
    				printf("retour a la ligne");
    			}
                    }
            }
    }
    voici le type de texte que je veux ouvrir

    MMMBBBbbMMMbb
    MMMbbbbbBBBBMMM
    MMMbbBBMM


    avec ce programme on lit bien le fichier charactere par character mais le probleme se pose lors du test de line avec le debugger

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    fgetc retourne un int et non un char. Typiquement on parcourt un fichier avec la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include <stdio.h>
     
    int main()
    {
        FILE * f = fopen("lab.txt", "r");
        if (f != NULL)
        {
            int c;
     
            while ((c = fgtec(f)) != EOF)
            {
                /* Fais ce que tu veux avec c */
            }
     
            fclose(f);
        }
        else
            perror("lab.txt");
     
        return 0;
    }
    Remarque : getc, fgetc et getchar retournent un int et non un char (elles retournent le caractère lu en cas de succès et EOF, une valeur qui n'est pas représentable par un char, si aucun caractère n'a pu être lu). De même putc, fputc et putchar attendent un argument int et non un char.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut
    Tu récupère le file descriptor, et tu utilise la fonction read (tu fais un read de 1), tu stock le tout dans un buffer et tu parcour tout ton fichier comme tu veux.

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par stevin Voir le message
    Tu récupère le file descriptor, et tu utilise la fonction read (tu fais un read de 1), tu stock le tout dans un buffer et tu parcour tout ton fichier comme tu veux.
    Je crois qu'il est mieux d'utiliser les fonctions standard tant qu'on peut encore les utiliser.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut
    Citation Envoyé par Melem Voir le message
    Je crois qu'il est mieux d'utiliser les fonctions standard tant qu'on peut encore les utiliser.
    Avec un read du file descriptor, on peut mettre en argument nimporte quel fichier pour le lire, puis une fois copier dans le buffer, toute sa chaine s'analyse avec une boucle, puis des if ou des pointeurs sur fonstions pour faire plus propre.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par stevin Voir le message
    Avec un read du file descriptor, on peut mettre en argument nimporte quel fichier pour le lire, puis une fois copier dans le buffer, toute sa chaine s'analyse avec une boucle, puis des if ou des pointeurs sur fonstions pour faire plus propre.
    Si tu veux faire de la lecture par bloc, il y a fread() sans quitter le cadre normalise.

    Il y a parfois des raisons d'en sortir, je n'en vois pas ici pour le moment.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par stevin Voir le message
    Avec un read du file descriptor, on peut mettre en argument nimporte quel fichier pour le lire, puis une fois copier dans le buffer, toute sa chaine s'analyse avec une boucle, puis des if ou des pointeurs sur fonstions pour faire plus propre.
    Cesse de répéter bêtement ce que tu as appris en cours sans essayer de comprendre ce que ça veut dire. read() n'est pas une fonction standard du langage C. Idem pour les 'file descriptor'. Ton raisonnement est donc limité à certaines implémentations. Autrement dit, osf.

    Quand aux pointeurs de fonctions, c'est utile pour faire de la programmation générique, évènementielle ou pour programmer des sorties de composants logiciels.

    http://emmanuel-delahaye.developpez.com/complog.htm

    Je ne vois pas le rapport avec le problème.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par stevin Voir le message
    Tu récupère le file descriptor, et tu utilise la fonction read (tu fais un read de 1), tu stock le tout dans un buffer et tu parcour tout ton fichier comme tu veux.
    Mais c'est quoi ce délire ? T'as fumé un truc ? Qu'est-ce qui ne va pas avec les fonctions standards ? Tu ne sais pas les utiliser ?

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    C'est corrige mais non signale chez melem. Outre le probleme d'avoir line (un nom mal choisi au passage) qui est defini comme char plutot que int -- ce qui ne pose de probleme qu'avec certain caractere non present dans ton exemple --,
    ne fait pas ce que tu penses. != est de priorite superieure a = et donc ca fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line = (fgetc(fp) != EOF)
    quand tu desires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (line=fgetc(fp)) != EOF

Discussions similaires

  1. [lecture d'un fichier] ligne par ligne
    Par pitit777 dans le forum C++
    Réponses: 3
    Dernier message: 26/11/2005, 11h22
  2. Lecture d'un fichier octet par octet
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 31/10/2005, 22h58
  3. Lecture d'un fichier octet par octet
    Par PopKoRn...X_x dans le forum C++
    Réponses: 10
    Dernier message: 01/07/2005, 19h09
  4. Lecture d'un fichier mot par mot
    Par hamster dans le forum C++
    Réponses: 7
    Dernier message: 21/02/2005, 17h25
  5. Réponses: 6
    Dernier message: 02/09/2003, 15h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo