Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Question lecture d'un fichier

Sujet résolu
    17 mai 2007 à 22:29:33

    Bien le bonsoir à vous,

    Je viens de tomber sur un exo sur les fichiers que je n'arrive pas à résoudre qui est le suivant:

    Créez un fichier texte à l’aide du bloc-note.
    Ce fichier contiendra en premier le nombre de mots puis la liste des mots (au moins une vingtaine de mots quelconques séparés par des espaces).
    Ecrivez ensuite un programme qui lise ce fichier et affiche à l’écran chacun des mots (un mot par ligne).
    Les mots ne devront pas être conservés en mémoire.

    Déjà je ne vois pas à quoi ca sert d'écrire en premier le nombre de mot de la liste ? :euh:

    Ensuite je n'arrive pas à afficher un mot par ligne.
    Le fgets affiche les mots sur la même ligne (vu qu'il s'arrête au \n et que mes mots sont seulement séparés par un espace).

    J'ai essayé avec un fgetc en mettant une boucle while(fgetc(fichier)!=EOF) et ensuite un if(fgetc(fichier == ' ') mais ca m'affiche un truc trop bizarre pas du tout en rapport avec mes mots.

    Et le fscanf je ne vois pas comment l'utiliser ici.

    Bref je saurais afficher ma liste si les mots étaient rentrés chacun sur une ligne et non pas séparés par un espace :/

    Quelqu'un pourrait il m'éclaircir ?

    Je vous remercie d'avance

    Bonne soirée :)

    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2007 à 22:42:00

      montre nous au moins un code source...
      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2007 à 22:42:14

        Citation : audeee

        Créez un fichier texte à l’aide du bloc-note.
        Ce fichier contiendra en premier le nombre de mots puis la liste des mots (au moins une vingtaine de mots quelconques séparés par des espaces).
        Ecrivez ensuite un programme qui lise ce fichier et affiche à l’écran chacun des mots (un mot par ligne).
        Les mots ne devront pas être conservés en mémoire.

        Déjà je ne vois pas à quoi ca sert d'écrire en premier le nombre de mot de la liste ? :euh:

        Ensuite je n'arrive pas à afficher un mot par ligne.
        Le fgets affiche les mots sur la même ligne (vu qu'il s'arrête au \n et que mes mots sont seulement séparés par un espace).

        J'ai essayé avec un fgetc en mettant une boucle while(fgetc(fichier)!=EOF) et ensuite un if(fgetc(fichier == ' ') mais ca m'affiche un truc trop bizarre pas du tout en rapport avec mes mots.

        Et le fscanf je ne vois pas comment l'utiliser ici.

        Bref je saurais afficher ma liste si les mots étaient rentrés chacun sur une ligne et non pas séparés par un espace :/


        Une fois que tu as chargé la ligne (fgets()), il faut la 'parser', c'est à dire en extraire chaque mot. On peut le faire avec strtok() ou avec un code écrit à la main (astuce de chacal: remplacer l'espace par un '\n'...).

        Une fois que le mot est extrait, on l'affiche sur une ligne.

        Il est vrai que le nombre de mots indiqué au début n'est pas nécessaire, mais il peut s'agir d'un contrôle...

        Fait de ton mieux et poste ton code si tu es planté.
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          17 mai 2007 à 22:57:19

          Ha d'accord je croyais qu'il était possible de mettre directement à la ligne avec une des fonctions de lecture des fichiers, mais en fait il faut ensuite passer par les chaines de caractères.

          Alors voilà ce que je viens de faire:

          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>

          #define MAX 1000

          int main()
          {
                  FILE * fichier;
                  char chaine [MAX];
                  int mot;
                  int longeur;
                  int i;

                  fichier = fopen("mots.txt","r");



                  if(fichier != NULL)
                   {
                     fscanf(fichier,"%d",&mot);
                     printf("Il y a %d mots dans le fichier.\n",mot);

                     while(fgets(chaine,MAX,fichier) != NULL)
                     {

                         printf("%s\n",chaine);
                     }

                         longeur = strlen(chaine);

                         for (i=0; i<strlen; i++)
                         {
                             if(chaine[i] == ' ')
                                printf("\n");
                           
                         else
                              printf("%c",chaine[i]);
                         }

                     fclose(fichier);
               }
                  return 0;
          }


          Au début ca m'affiche la liste de mots entière sans retour à la ligne et ensuite je l'affiche mot par mot.

          Ca a l'air de marcher comme ca mais c'est assez drole j'ai une sonnerie qui retentie à l'execution :o Je ne savais pas que ca pouvait arriver d'ailleurs :/
          Vous savez d'ou ca peut venir ?

          Encore merci :)
          • Partager sur Facebook
          • Partager sur Twitter
            18 mai 2007 à 1:04:08

            Salut!

            C'est marrant aude, c'est exactement l'exo mot pour mot que j'ai fait hier...

            Personnelement j'ai pas fait comme ça, j'ai utilisé fscanf pour le premier mot ( un nombre) exactement comme toi, puis apres j'ai tout simplement fait:

            for(i=0;i<mot;i++)
            {
            fscanf(fichier,"%s",chaine);
            printf("%s\n",chaine);
            }


            c'est 10 fois plus simple!!

            c'est en cela que consiste l'exo, on te demande le nombre de mots afin dutiliser ce nombre.
            • Partager sur Facebook
            • Partager sur Twitter
              18 mai 2007 à 1:11:48

              Il y avait quelques erreurs dans ton code.


              int main()
              {
                  FILE * fichier;
                  char chaine [MAX];
                  int mot;
                  int longueur;
                  int i;

                  fichier = fopen("mots.txt","r");

                  if(fichier != NULL)
                  {
                      fscanf(fichier,"%d",&mot);
                      printf("Il y a %d mots dans le fichier.\n",mot);
                      fgets(chaine,MAX,fichier);
                      printf("%s\n",chaine);
                      longueur = strlen(chaine);
                     
                      for (i=0; i<longueur; i++)
                      {
                          if(chaine[i] == ' ')
                              printf("\n");
                          else
                              printf("%c",chaine[i]);
                      }
                      fclose(fichier);
                  }
                  return 0;
              }



              Variante:

              #include <stdio.h>
              #include <stdlib.h>
              #include <string.h>

              #define MAX 1000

              int main()
              {
                  FILE * fichier;
                  char c;
                  int mot=0;
                  int i=0;

                  fichier = fopen("mots.txt","r");

                  if(fichier != NULL)
                  {
                      fscanf(fichier,"%d",&mot);
                      printf("Il y a %d mots sur la premiere ligne dans le fichier.\n",mot);

                      while(i<=mot && c!='\n')
                      {
                          if((c=fgetc(fichier)) == ' ')
                          {
                              printf("\n");
                              i++;
                          }
                          else
                              printf("%c",c);
                      }
                  }
                  fclose(fichier);
                  return 0;
              }
              • Partager sur Facebook
              • Partager sur Twitter
                18 mai 2007 à 1:24:05

                Ha oui oui en effet saf_mass :D 10 fois plus rapide comme ca !
                J'avais pas vu l'utilité du nombre de mots.

                Bizarre bizarre que tu es fait le même exo ;)

                En tout cas encore merci, les fichiers maintenant c'est capté ^^
                • Partager sur Facebook
                • Partager sur Twitter
                  18 mai 2007 à 1:29:08

                  Ptet que tu es dans la meme ecole que moi!
                  ECE?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mai 2007 à 1:38:11

                    Citation : audeee

                    Ha d'accord je croyais qu'il était possible de mettre directement à la ligne avec une des fonctions de lecture des fichiers, mais en fait il faut ensuite passer par les chaines de caractères.


                    Oui, ça devrait être possible avec fscanf(), mais je dois avouer que je l'utilise rarement, vu qu'il est difficile de correctement l'utiliser...

                    Mais ceci devrait convenir :

                       char mot[32];
                       while (fscanf(fp, "%31s", mot) == 1)
                       {
                          printf ("%s\n");
                       }

                    Citation : Pas de titre


                    Alors voilà ce que je viens de faire:


                               while(fgets(chaine,MAX,fichier) != NULL)
                               {

                                   printf("%s\n",chaine);
                               }

                                   longeur = strlen(chaine);

                                   for (i=0; i<strlen; i++)
                                   {
                                       if(chaine[i] == ' ')
                                          printf("\n");
                                     
                                   else
                                        printf("%c",chaine[i]);
                                   }



                    Le traitement devrait être dans la boucle parce qu'il concerne la ligne lue... Chaque tour de boucle lit une nouvelle ligne...
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      18 mai 2007 à 14:17:16

                      Citation : saf_mass

                      Ptet que tu es dans la meme ecole que moi!
                      ECE?



                      Tout à fait ^^ même école et même groupe :D


                      -ed- merci encore pour l'aide apporter ;)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [C] Question lecture 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