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

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    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 éclairé 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
    Points : 858
    Points
    858
    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.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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)
    Pas de Wi-Fi à la maison : CPL

  9. #9
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    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.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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...
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    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!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par deathsurfer
    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!
    Il ne faut pas coder sans savoir exactement ce qu'on a à coder. Tu es perdu dans des problèmes d'implémentation qui n'ont sans doute pas lieu d'être si tu suis pas à pas la démarche formelle de construction de tout projet, aussi petit soit-il.

    1 - Définition (quoi ?)
    2 - Conception (comment ?)
    3 - Réalisation

    Les phases 1 et 2 sont appelées "études préalables". Je pense qu'il n'y a qu'en informatique qu'on s'autorise à réaliser (coder) sans études préalables. Les informaticiens doivent sans doute se prendre pour des génies...

    Moi, je ne suis pas un génie, et je me contente d'appliquer les bonnes vielles recettes qui mènent au succès :

    1 - Définition.

    A toi de jouer.
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    Par défaut
    Je me suis mal exprimé...strcmp (s, "x\n") == 0 compare la chaine s avec la chaine "x\n".
    Dans votre reponse,qu'est ce que s? qu'est ce x ?
    Je ne suis pas perdu dans un probleme d'implementation je suis perdu dans un probleme de syntaxe car je sais où je vais.
    De plus je ne me considere pas comme un genie,ne me jugez pas si vous ne me connaisssez pas,ne jugez pas mon ancien prof (parti de l'ecole) non plus vous ne savez meme pas qui c'est...Il n'est peut etre pas un specialiste du C (apparement vous travaillez dans l'info embarqué et c'est normal vous l'utilisez tous les jours...) mais celui-ci a quand meme participé au projet L'E-Lyee, et il a un très bon niveau en Java par ex (chacun ses particularités).
    Je ne fais que redemander ce qui n'etait pas clair pour moi dans votre reponse au post precedant...Si vous ne voulez pas me répondre tant pis.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par deathsurfer
    Je me suis mal exprimé...strcmp (s, "x\n") == 0 compare la chaine s avec la chaine "x\n".
    Dans votre reponse,qu'est ce que s? qu'est ce x ?
    J
    C'est la traduction en C de ton désir de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (c==mavariable+le caractere \n)
    s est la chaine à comparer
    "x\n" est 'mavariable+le caractere \n'

    Et là, on voit bien le problème. On ne peux comparer que de caractères entre eux (avec ==) ou des chaines entre elles (avec strcmp()), mais comparer une chaine avec un caractère est absurde, d'où mon insistance sur la définition du but recherché, car là, visiblement, le code fait n'importe quoi...

    Mais si tu ne veux pas répondre, ça ne me dérange pas.

    Désolé d'essayer de t'aider...
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    Par défaut
    Oui je suis d'accord on ne compare pas un caractere avec une chaine. De plus, c'est grâce à des gens comme vous que se forgent des étudiants comme moi car comme on dit "c'est en forgerant qu'on devient forgeron!".Alors merci de votre bénévolat et de votre aide.

    En revanche j'ai essayé :
    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
     
    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 (strcmp(lecture,"mavariable\n") ==0))
          {
             printf("trouve %s",mavariable);
          }*/
          printf("%c",lecture);
       }
       fclose(fichier1);
    }
    ;
    ici printf("%c",lecture) ne m'affiche qu'une lettre sur 2 alors qu'avec while(!feof(fichier1)) j'obtiens tout le contenu du fichier...
    J'utilise bien un "%c" car j'affiche des caracteres meme si le type de lecture est int.
    Ensuite j'essaye (toujours avec le while(!feof(fichier1)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (strcmp(lecture,"mavariable\n") ==0))
    {
       printf("trouve %s",mavariable);
    }
    ce bout de code fait planter le programme...
    Merci et bonne nuit !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par deathsurfer
    En revanche j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                                 while ((lecture = fgetc (fichier1)) != EOF)
                               {
                                     lecture = fgetc(fichier1);
                                printf("%c",lecture);
                               }
    ici printf("%c",lecture) ne m'affiche qu'une lettre sur 2 a
    Ben oui, y'a 2 fgetc(). C'est un de trop !
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    Par défaut
    En fait je n'arrive pas a traduire cet algo en C. En plus, il n'y a pas de getline en C...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ecrire("rentrer le mot")
    lire (mot)
    ouvrir (fichier1)
    tant que non fin de fichier
    	vb=lire_ligne(fichier1) //jusqu'a trouver le caractere '\n'
    	si vb==mot alors //ici on utilise strcmp
    		ecrire("trouve")
    	fin si
    fin tant que
    fermer(fichier1)
    C'est-à-dire si le mot est contenu dans le fichier on ecrit trouve, sachant qu'il y a dans le fichier un mot par ligne. Peut etre en utilisant strstr(chaine,souschaine) mais lecture devrait etre une chaine et non un caractere...
    Merci d'avance

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par deathsurfer
    En fait je n'arrive pas a traduire cet algo en C. En plus, il n'y a pas de getline en C...
    Il y a fgets().

    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
     
    /* ecrire("rentrer le mot") */
    printf (...)
     
    /* lire (mot) */
    fgets(..., stdin)
     
    /* ouvrir (fichier1) */
    fopen()
    /* tant que non fin de fichier */
    /* 	vb=lire_ligne(fichier1) //jusqu'a trouver le caractere '\n' */
       while (fgets(...) != NULL)
       {
    /* 	si vb==mot alors //ici on utilise strcmp */
          if (strcmp(...) == 0)
          {      
    /* 		ecrire("trouve") */
    /* 	fin si */
    /* fin tant que */
    /* fermer(fichier1)
    Pour les détails, garder en tête que fgets() prend toute la ligne (quand il peut), y compris le '\n'.

    Il peut s'avérer utile de le supprimer proprement...

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 145
    Points : 102
    Points
    102
    Par défaut
    Genial j'ai bien avancé! En parcourant ton site, je me suis aperçu qu'il fallait bannir le scanf sous peine de nombreux de nombreux problemes. J'ai donc repris avec un fgets(...,...,stdin). Pourtant meme en vidant le buffer clavier, une erreur survient dans ce code: dans le fichier 1.txt une ligne est sauté avant d'ecrire les 3 premiers caracteres de ma chaine, et dans le fichier 2.txt les 3 premiers caracteres seulement de ma chaine sont ecrits.
    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
     
        FILE *fichier1;
        FILE *fichier2;
        char *vfr;
        char *van;
        int c;
        vfr= (char *)malloc(32*sizeof(char));
        van= (char *)malloc(32*sizeof(char));
        /*verification de l'existence du fichier*/
        fichier1=fopen("1.txt","rt");
        if (fichier1==NULL)
         {
             printf("fichier1 inexistant\n");
             /* création et ouverture du fichier*/
            fichier1=fopen("1.txt","w");
            fclose(fichier1);
     
            /*on estime que si fichier1 n'existe pas alors fichier2 non plus*/
            fichier2=fopen("2.txt","w");
            fclose(fichier2);
         }
     
             printf("fichier1 existant\n");
             /*le mode "a" autorise les operations d'écriture dans le fichier et place le curseur à la fin du fichier */
             /*De plus, ce mode n'efface pas le contenu du fichier s'il existe déjà*/
             fichier1=fopen("1.txt","a");
             while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
             printf("entrer le verbe en francais :\n");
             fgets(vfr,sizeof vfr,stdin);
             //scanf("%s",vfr);
             /*fprintf permet d'ecrire dans le fichier*/
             fprintf(fichier1,"%s",vfr);
             fclose(fichier1);
             /*on estime que si fichier1 existe alors fichier2 existe*/
             fichier2=fopen("2.txt","a");
             printf("entrer le verbe en anglais:\n");
             while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
             fgets(van,sizeof van,stdin);
             //scanf("%s",van);
             fprintf(fichier2,"%s",van);
             fclose(fichier2);
             return 1;
    Merci !

  20. #20
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Je ne comprends pas pourquoi tu vides de tampon avant de faire un appel à fgets(). Si tu utilses que fgets() pour tes entrées utilisateur, cette opération est inutile, et dans le cas du code que tu présente, introduit des problèmes.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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