Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP pendu, compter les mots d'un fichier

    24 septembre 2018 à 19:10:33

    Bonjour, j'apprend le C depuis peu et je ne comprends pas pourquoi le pointeur mots vaut NULL

    Voici mon code:

    #include <stdio.h>
    #include <stdlib.h>
    
    #include "dico.h"
    
    void nbMotsDansFichier()
    {
        FILE *mots = NULL;
        int nbMots = 0;
        int caractereLu = 0;
    
        mots = fopen("mots.txt", "r");
        if(mots != NULL)
        {
            while(caractereLu != EOF)
            {
                caractereLu = fgetc(mots);
                if(caractereLu == '\n')
                nbMots++;
            }
        printf("%d mots dans mots.txt", nbMots);
        }
        else
        {
            printf("mot == NULL");
        }
    fclose(mots);
    
    }
    

    -
    Edité par PaulErny 24 septembre 2018 à 19:21:01

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2018 à 19:39:53

      Hello,

      Vraissemblablement car le fichier n'a pas pu être ouvert. Voilà l'occasion d'apprendre une nouvelle fonction de la librairie c: perror(). Remplace, ligne 25, printf("....") par perror("...."). Tu auras déjà une raison plus précise pour laquelle le fichier n'a pas pu être ouvert (n'existe pas, pas les droits....)

      Edit: au fait, pas besoin de fermer le fichier s'il n'a pu être ouvert....

      -
      Edité par edgarjacobs 24 septembre 2018 à 20:00:40

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        24 septembre 2018 à 19:43:00

        Salut,

        As-tu vérifié que le chemin vers ton fichier "mots.txt" est correct ?

        Fais attention à ce qu'il corresponde bien au chemin relatif à l'emplacement de ton .exe (à la compilation).

        Sinon, indique un chemin absolu (juste pour tester si le problème vient bien de là).

        • Partager sur Facebook
        • Partager sur Twitter
        Je pratique l'informatique.
          24 septembre 2018 à 19:48:36

          Merci,

          J'avais nommé le fichier "mots.txt" mais comme il s'agissait déjà d'un fichier texte, il suffisait de le nommer "mots".

          • Partager sur Facebook
          • Partager sur Twitter
            28 septembre 2018 à 16:54:19

            Salut,

            1) D'abord, ton code ne marchera pas s'il n'y a qu'une ligne de mot dans mots.txt et que tu ne mets pas de retour à la ligne à la fin du fichier, ou si les mots sont séparés par plusieurs '\n' et un tas d'autres cas. Je t'invite à essayer mon code, peu importe les '\n' que tu mets entre les mots il ne va compter que les lignes qui ne sont pas vides.

            #include <stdio.h>
            
            int nb_mots() {
                int mots=0;
                char maintenant, avant='\n';
                FILE *f=NULL;
                f=fopen("mots.txt", "r");
                if(f) {
                    do {
                        maintenant=fgetc(f);
                        /*Si ça passe à la ligne, et que le caractère précédent n'est pas
                        un passage à la ligne aussi alors on incrémente "mots"
                        PS: donc on n'incrémente pas si on a \n\n à la suite*/
                        if(maintenant=='\n' && avant!='\n') mots++;
                        /*Si c'est la fin du fichier et qu'on a lu au moins un caractère
                        autre que \n (ca veut dire que le fichier n'est pas vide de mot)
                        Alors on incrémente encore "mots"*/
                        if(maintenant==EOF && avant!='\n') mots++;
                        avant=maintenant;
                    }
                    while(maintenant!=EOF);
                    //On ferme le fichier
                    fclose(f);
                }
                else {
                    //S'il y a quelconque erreur nous empêchant d'ouvrir le fichier
                    perror("Erreur");
                }
                //On retourne le nombre de mots
                return mots;
            }
            
            int main() {
                printf("Le nombres de mots: %d\n", nb_mots());
                return 0;
            }
            



            2) Mets le fclose() dans le if, comme dit edgarjacobs, inutile de fermer ce qui n'a jamais été ouvert.

            3) Des fois les gens (sous windows) créent des fichiers *.txt et mettent un .txt à la fin du coup le vrai chemin du fichier est mots.txt.txt parce que windows masque par défaut les extensions qu'il connait, tu devrais afficher les extensions pour voir si c'est le chemin vers mots.txt est correct. Tu peux aussi aller dans cmd et taper:

            cd "C:\chemin\vers\ton projet"
            dir

            Vérifie le nom de mots.txt et si ton exécutable est dans le même dossier. Tu peux faire un printf("%s", argv[0]); pour voir si ton exécutable s'exécute vraiment dans le même dossier que mots.txt.

            4) Mets perror("Erreur"); dans le else pour voir pourquoi il ne peux pas l'ouvrir



            -
            Edité par Malice13 28 septembre 2018 à 17:34:05

            • Partager sur Facebook
            • Partager sur Twitter

            Malice13

            TP pendu, compter les mots d'un fichier

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown