Partage
  • Partager sur Facebook
  • Partager sur Twitter

EOF non reconnu

lire des mots dans un fichier txt

    18 février 2017 à 22:37:57

    Bonjour à tous,

    afin d'améliorer le jeu du pendu demandé dans le TP (langage C) je souhaite compter le nombre de mots contenu dans un fichier txt.

    Pour mettre fin à la lecture de mon fichier j'ai la condition suivante: while(caractereActuel != EOF); Mais mon EOF n'est pas reconnu et la boucle s'effectue indéfiniment ! Voici mon code complet:

    #include <stdio.h>
    #include <stdlib.h>
    
    int caractereActuel=0;
    int nbrDeMot=0;
        int main(int argc, char *argv[])
    {
        FILE* fichier = NULL; // on cree un pointeur de FILE initialisé à NULL
        fichier = fopen("essai1.txt", "r+");
        //on va tester si l'ouverture du fichier c'est bien passé
        if (fichier != NULL)
        {
            // On peut lire et écrire dans le fichier
            do
            {
                do
                {
                    caractereActuel = fgetc(fichier); // On lit le caractère
                    printf("%c", caractereActuel); // On l'affiche
                } while (caractereActuel != '\n'); // On continue tant que fgetc n'a pas retourné fin de ligne
                nbrDeMot = nbrDeMot +1;
            }while(caractereActuel != EOF);
            printf("Ce fichier contient %d lignes\n",nbrDeMot);
            printf("EOF = %d", EOF);  //permet d'afficher la valeur retournee par EOF sur mon OS
            fclose(fichier); // On ferme le fichier qui a été ouvert
        }
        else
        {
            // On affiche un message d'erreur si on veut
            printf("Impossible d'ouvrir le fichier arbre.txt");
        }
    
        return 0;
    }

    Merci d'avance pour votre aide!

    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2017 à 10:23:20

      Bonjour ! Question bête : est-ce que le fichier se termine obligatoirement par un '\n' ? Si ce n'est pas le cas, c'est la boucle interne qui ne peut pas se terminer lorsqu'il lit la dernière ligne. Peut-être faudrait-il que le while interne ressemble à ça (mais je n'ai pas testé, c'est juste une idée) :

      while ((caractereActuel != '\n') || (caractereActuel != EOF))



      • Partager sur Facebook
      • Partager sur Twitter
        19 février 2017 à 13:25:25

        Salut,

        D'ailleurs, il faut vérifier le dernier caractère pour savoir s'il faut ajouter une ligne ou non. Si la dernière ligne ne contient pas de '\n' elle ne sera pas comptabilisée par un algo qui compte les \n'...

        Au pire, on peut compter les lignes à coups de fgets(), mais ça peut foirer si une ligne est plus grande que la limitation que tu donnes à fgets().

        à noter que sous le bloc-note de windows, un retour à la ligne est automatiquement effectué après 1024 caractères, mais sans pour autant introduire '\r' +'\n'. Ce n'est donc que visuel, pas effectif.

        Bonne continuation.

        • Partager sur Facebook
        • Partager sur Twitter

        Bonhomme !! | Jeu de plateforme : Prototype.

          19 février 2017 à 17:37:55


          Bonjour

          robun a écrit:

          Peut-être faudrait-il que le while interne ressemble à ça (mais je n'ai pas testé, c'est juste une idée) :

          while ((caractereActuel != '\n') || (caractereActuel != EOF))
          Cette condition est toujours vraie.

          • Partager sur Facebook
          • Partager sur Twitter
            19 février 2017 à 18:04:05

            Argh, la faute d'inattention ! :waw: Il faut bien sûr mettre && et pas ||

            -
            Edité par robun 20 février 2017 à 8:58:57

            • Partager sur Facebook
            • Partager sur Twitter

            EOF non reconnu

            × 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