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 :

compter les occurences dans un fichier avec fgetc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Par défaut compter les occurences dans un fichier avec fgetc
    le fichier.txt contient la phrase : coucou patatra
    je veux compter le nombre de a. Si j'ai bien compris, la fonction fgetc lit dans le fichier caractere par caractere, et retourne le caractere lu.Pourtant le code suivant ne marche pas. Pourriez vous m'expliquer?

    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
    #include <stdio.h>
     
    void main ()
    {
         FILE *f ;
         char c;
         int i;
     
         i=0;
         f = fopen ("fichier.txt", "r");
         if( f== NULL)
            printf ("Erreur d'ouverture du fichier");
         else {
                 while(!feof(f))
                 { 
                    c = fgetc(f);
                    if(c=="a")
                    {
                              i=i+1;
                    }
                    printf("%c",c);
                    }
                    printf("il y a %d a",i);
            }
        fclose (f);
        system("pause");
    }
    Merci de votre aide.

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Le double quote est réservé pour les chaines de caractères. Il faut utiliser le simple quote pour les caratères.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Par défaut Merci
    Lol effectivement, je vais aller m'acheter des yeux a decathlon ils font des promos je crois....
    merci crocro!

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                 while(!feof(f))
                 { 
                    c = fgetc(f);
    feof n'a pas d'effet predictif. Il faut faire l'IO et puis tester le resultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int c;
    while( (c=fgetc(f)) != EOF) {
    }
    A noter que le type de c est important, sinon on a des problemes (classiquement boucle infinie ou ÿ mepris pour la fin du fichier).

  5. #5
    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 deathsurfer
    Pourtant le code suivant ne marche pas. Pourriez vous m'expliquer?
    Et si tu lisais les messages de ton compilateur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:3: warning: function declaration isn't a prototype
    main.c:3: warning: return type of 'main' is not `int'
    main.c: In function `main':
    main.c:16: warning: comparison between pointer and integer
    main.c:25: warning: implicit declaration of function `system'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 4 warnings
    Il ne te dit rien ? Il est peut être mal configuré...

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Après corrections, il reste :
    • Les chaines envoyées à stdout doivent être terminées par un '\n'
    • Pour tester la fin de lecture, on utilise la valeur retournée par la fonction de lecture
    • c doit être de type int pour pouvoir être comparé à EOF (int < 0)
    • i = i + 1 est une forme naïve de i++
    • fclose() doit être dans la branche '!=NULL', sinon c'est le drame (comportement indéfini en cas d'erreur d'ouverture)
    • Il est bon de réduire la portée des variables au minimum

    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
     
    #include <stdio.h>
    int main (void)
    {
       FILE *f = fopen ("fichier.txt", "r");
       if (f == NULL)
          printf ("Erreur d'ouverture du fichier\n");
       else
       {
          int c;
          int i = 0;
          while ((c = fgetc (f)) != EOF)
          {
             if (c == 'a')
             {
                i++;
             }
          }
          printf ("il y a %d 'a'\n", i);
          fclose (f);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    il y a 3 'a'
     
    Press ENTER to continue.
    Compléments :

    http://emmanuel-delahaye.developpez....s.htm#fichiers

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Par défaut
    Etant donné que je code sous windows et toi unix, dev cpp ne renvoye pas ces erreurs que renvoye gcc. De plus fgetc(!feof fichier) est un algorithme qui m'a été donné par mon professeur de C. Ainsi il a peut etre estimé que pour l'instant cela suffisait...
    Pour le type de la variable je suis d'accord, il vaut mieux mettre un int plutôt qu'un char.
    En revanche, qu'est ce qu'un effet predictif ?
    De plus si je veux comparer avec une variable suivi d'un retour a la ligne quelle est la syntaxe svp?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(c==variable & '\n')
                    {
                              i=i+1;
                    }
    Merci d'avance.

  7. #7
    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 deathsurfer
    En revanche, qu'est ce qu'un effet predictif ?
    La fonction de feof, c'est d'indiquer qu'une operation d'IO precedante a echoue a cause de la fin de fichier (et si l'IO c'est fgetc, elle a elle meme indique qu'elle echouait avec un EOF), pas que l'operation d'IO suivante va echouer.

    Donc dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (!feof(f)) {
       char c = fgetc(f);
       ...
    }
    le reste du code de la boucle va etre execute une fois avec c = (char)EOF tandis qu'avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int c;
    while ( (c = fgetc(f) != EOF) {
       ...
    }
    il n'y aura pas de telle execution. Ce n'est pas une question d'oublier de tester un cas particulier, c'est une question d'avoir un resultat correct dans tous les cas ou le corps de la boucle n'ignore pas (char)EOF.

    (Dans d'autres langages, Pascal, Ada pour en citer deux, l'equivalent de feof a un effet predictif, il indique qu'on est a la fin du fichier et donc que la prochaine operation d'IO echouera pour cause de fin de fichier, la premiere structure est correcte dans ces langages et la deuxieme incorrecte).

  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 Jean-Marc.Bourguet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (!feof(f)) {
       char c = fgetc(f);
       ...
    }
    le reste du code de la boucle va etre execute une fois avec c = (char)EOF <...>Ce n'est pas une question d'oublier de tester un cas particulier, c'est une question d'avoir un resultat correct dans tous les cas ou le corps de la boucle n'ignore pas (char)EOF.
    de plus, en cas d'erreur de lecture, le bouclage est infini...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Par défaut
    Bonjour! Merci pour l'explication sur feof(f)!
    En revanche,
    if (strcmp (s, "x\n") == 0)
    n'est pas clair...(j'espere etre aussi bon que toi un jour emmanuel lol)
    je voudrais if (c==mavariable+le caractere \n) {.....}
    mavariable est un type *char saisie prealablement par l'utilisateur que je recupere avec scanf (mavariable est seulement un mot sans espace)...Le code te sera surement plus explicite que mon expression lol

    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
    printf("entrer le verbe\n");
                           scanf("%s",mavariable);
                           fichier1=fopen("verbesfr.txt","rt");
                           if (fichier1==NULL)
                           {
                              printf("erreur");
                              exit(1);
                           }
                           else
                           {
                                 while ((lecture = fgetc (fichier1)) != EOF)
                               {
                                     lecture = fgetc(fichier1);
                                      if (lecture ==mavariable+le caractere \n)
                                     {
                                        printf("trouve %s",mavariable);
                                     }
                               }
                               fclose(fichier1);
                            }
                               ;
    Merci beaucoup tu es d'une aide précieuse!

  10. #10
    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 deathsurfer
    Etant donné que je code sous windows et toi unix, dev cpp ne renvoye pas ces erreurs que renvoye gcc.
    Pas de chance, tes renseignements sont faux. J'ai fait le test sous Windows. Dev-C++ utilise MinGW (Minimalist gcc for Windows), et je t'ai même indiqué comment configurer ton compilateur...

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Citation Envoyé par -ed- codage
    Reglages dans wxDev-C++ (remplace Dev-C++ devenu obsolète)

    Outils / Options du compilateur
    Dans la zone de saisie "Ajouter les commandes suivantes lors de l'appel du compilateur",
    copier/coller les options que je recommande.
    Valider
    Régénérer (Ctrl-F11)
    Que faire de plus ?

    De plus fgetc(!feof fichier) est un algorithme qui m'a été donné par mon professeur de C.
    Alors il faut changer de prof au plus vite, parce qu'il se trompe.

    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Ainsi il a peut etre estimé que pour l'instant cela suffisait...
    Il est extrêmement grave d'enseigner des concepts erronés.
    De plus si je veux comparer avec une variable suivi d'un retour a la ligne quelle est la syntaxe svp?
    if (strcmp (s, "x\n") == 0)

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par deathsurfer
    Etant donné que je code sous windows et toi unix, dev cpp ne renvoye pas ces erreurs que renvoye gcc.
    C'est juste que ton compilateur est mal configuré : Comment bien configurer son compilateur.

    Citation Envoyé par deathsurfer
    De plus fgetc(!feof fichier) est un algorithme qui m'a été donné par mon professeur de C. Ainsi il a peut etre estimé que pour l'instant cela suffisait...
    Non c'est comme si tu comptais sur les feux stop de ta voiture pour t'arrêter ! Il faut utiliser le frein, les feux ne sont que pour avertir les autres conducteurs.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter les lignes dans un fichier texte.
    Par morora69 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/06/2010, 16h20
  2. [DEBUTANT] compter les occurences dans un texte
    Par yooo38 dans le forum Général Python
    Réponses: 6
    Dernier message: 16/02/2010, 21h48
  3. Compter les occurences dans une chaîne
    Par AuBozon dans le forum Débuter
    Réponses: 3
    Dernier message: 27/04/2008, 11h17
  4. Compter les occurences dans un tableau trié
    Par degseb dans le forum Pascal
    Réponses: 2
    Dernier message: 10/01/2008, 16h34
  5. Compter les occurences dans relation "n vers n"
    Par yamayo dans le forum Access
    Réponses: 3
    Dernier message: 02/10/2006, 18h54

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