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 :

Lecture d'un fichier et stocker le contenu dans des variables


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut Lecture d'un fichier et stocker le contenu dans des variables
    Bonjour

    J'essaye de lire un fichier qui contient des donnees, et mon programme devra lire le contenu et stocker le contenu lu dans des variables de type char. Mon code maintenant ne commence a stocker qu'a partir de la troisieme ligne. Je ne vois pas ou est le probleme.

    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
     
    int parser (void) {
      int n = 0;
      char buffer [ 81 ];
      char arg[50][9]; // tableau pour les donnees
      /* Verifier le succes de l'ouverture */
      if ( ( sf = fopen ( fname, "r" ) ) == NULL ) {
        fprintf ( stderr, "MAKELIST: Unable to open %s!\n", fname ); 
        exit ( 1 );
        }
     
      /* Lecture du fichier */
      fgets ( buffer, 81, sf ); 
       while ( ! feof ( sf ) ) {  
        fputs ( buffer, stdout );
     
        /* si un des mots contenus dans le fichier est "add", chercher 
            si un deuxieme mot dans la meme ligne existe, 
            puis le stocker lui aussi */
     
        if (strcmp(arg[n],"add")){
            fscanf(sf, "%s %s\n", arg[n], arg[n+1]); 
            }
     
        // Stocker tout les mots tant que la while loop s'execute
        fscanf(sf, "%s\n", arg[n]); 
     
        // imprimer ce qui a ete stocker pour tester
        printf("%s\n", arg[n]);
        fgets ( buffer, 81, sf );
        n++; // incrementer le compteur
        }
        fclose ( sf ); //fermer le fichier
      return 0;
    }
    Un exemple de fichier sf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    un
    deux
    add qqchose
    trois
    quat
    L'output de la ligne printf("%s\n", arg[n]);

    Normalement, l'output devrait etre le meme que le fichier sf.

    Comment faire pour ne pas avoir le retour de la ligne quand add est lue.

    Pourquoi un et deux n'ont pas ete lue et imprimee ?

    PS: la variable fname a ete declare en tant que static (pour une utilisation ulterieur dans d'autres fonctions).

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est lié au mélange fgets qui lit une ligne et les fscanf qui lisent des chaînes sur le même fichier. On devrait avoir une lecture par ligne avec fgets et une analyse de chaque ligne par sscanf
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Merci, j'ai utilise sscanf, et ca semble marcher, mais seulement un mot par ligne

    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
     
    int parser (void) {
      int n = 0;
      char buffer [ 81 ], arg[50][9];
     
      if ( ( sf = fopen ( fname, "r" ) ) == NULL ) {
        fprintf ( stderr, "MAKELIST: Unable to open %s!\n", fname );
        exit ( 1 );
        }
     
      fgets ( buffer, 81, sf );
      while ( ! feof ( sf ) ) {
        if (strcmp(arg[n],"add")){
            sscanf(buffer, "%s %s\n", arg[n], arg[n]+strlen(arg[n]));
            }
        sscanf(buffer, "%s\n", arg[n]);
        char *p;
        p = arg[n]+strlen(arg[n]);
        if (arg[n] != NULL && !p){
            printf("%s\n", arg[n]);
            }
        if (arg[n] != NULL && p){
            printf("%s %s\n", arg[n], p);
            }
        fgets ( buffer, 81, sf );
        n++;
        }
        fclose ( sf );
      return 0;
    }
    quand le fichier contient par exemple dans n'importe quel ligne: add qchose Le programme ne stocke que "add" dans arg[n] et ne fait rien pour le mot qui suit add. J'ai essaye d'utiliser strlen... sans succes.
    Des idees sur comment y remedier ?

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    pourrais tu mettre le code complet s'il te plaît.
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    # include <stdio.h>
    # include <string.h>
    # include <stdlib.h>
    # include <ctype.h>
     
    void createfile(char []);
     
    static FILE *sf;
    static char fname[30];
    static char com[81];
     
    int parser (void) {
      int n = 0;
      char buffer [ 81 ], arg[50][9];
     
      if ( ( sf = fopen ( fname, "r" ) ) == NULL ) {
        fprintf ( stderr, "MAKELIST: Unable to open %s!\n", fname );
        exit ( 1 );
        }
     
      fgets ( buffer, 81, sf );
      while ( ! feof ( sf ) ) {
        //fputs ( buffer, stdout );
        if (strcmp(arg[n],"add")){
            sscanf(buffer, "%s %s\n", arg[n], arg[n]+strlen(arg[n]));
            }
        sscanf(buffer, "%s\n", arg[n]);
        char *p;
        p = arg[n]+strlen(arg[n]);
        if (arg[n] != NULL && !p){
            printf("%s\n", arg[n]);
            }
        if (arg[n] != NULL && p){
            printf("%s %s\n", arg[n], arg[n]+strlen(arg[n]));
            }
        fgets ( buffer, 81, sf );
        n++;
        }
        fclose ( sf );
      return 0;
    }
     
    int newfile ( )
    {
      printf ("\n\tPlease, specify a filename: " );
      gets(fname);
      createfile(fname);
      return 0;
    }
     
    void createfile(char file[]){
       sf = fopen(file, "w");
       if ( sf != NULL ) {
          printf("\n\tFile \"%s\" created.\n", file);
          printf("\n\tEnter commands : \n");
          fclose (sf);
          }
    }
     
    void append(){
       sf = fopen(fname,"a");
       if ( sf != NULL ) {
           fprintf(sf, "%s\n", com);
           fclose(sf);
           }
    }
     
    int main (void) {
     
     printf("Enter commands : \n");
     
     while ( strcmp(com, "quit") != 0 ) {
       printf("\t >  ");
       gets(com);
       if (sf == NULL) {
          printf("\n\tError, no script file detected.\n ");
          newfile();
          }
         append();
       }
      parser();
    return 0;
    }

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par virtuadrack Voir le message
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    # include <stdio.h>
    # include <string.h>
    # include <stdlib.h>
    # include <ctype.h>
    
    void createfile(char []);
    
    static FILE *sf; // Ces globales ne sont pas justifiées . A éviter absolument!
    static char fname[30];
    static char com[81];
    
    int parser (void) {
      int n = 0;
      char buffer [ 81 ], arg[50][9];
    
      if ( ( sf = fopen ( fname, "r" ) ) == NULL ) {
        fprintf ( stderr, "MAKELIST: Unable to open %s!\n", fname );
        exit ( 1 );
        }
    
      fgets ( buffer, 81, sf );
      while ( ! feof ( sf ) ) {
        //fputs ( buffer, stdout );
        if (strcmp(arg[n],"add")){ // la chaîne arg[n] n'est pas initialisée pour n =0
            sscanf(buffer, "%s %s\n", arg[n], arg[n]+strlen(arg[n]));
             // strlen(arg[n]) n'est pas signifiant à l'entrée de la fonction puique arg[n] n'est rempli qu'à la sortie de la fonction!
    // De plus ca n'a aucun sens d'aller écrire à cette adresse
            }
        sscanf(buffer, "%s\n", arg[n]);
        char *p;
        p = arg[n]+strlen(arg[n]); // idem, cette adresse n'a pas de sens
        if (arg[n] != NULL && !p){ // arg[n] et p sont != NULL, c'est sur
            printf("%s\n", arg[n]);
            }
        if (arg[n] != NULL && p){
            printf("%s %s\n", arg[n], arg[n]+strlen(arg[n])); // idem
            }
        fgets ( buffer, 81, sf );
        n++;
        }
        fclose ( sf );
      return 0;
    }
    
    int newfile ( )
    {
      printf ("\n\tPlease, specify a filename: " );
      gets(fname); // ne pas utilier gets mais fgets sur le flux stdin  createfile(fname);
      return 0;
    }
    
    void createfile(char file[]){
       sf = fopen(file, "w");
       if ( sf != NULL ) {
          printf("\n\tFile \"%s\" created.\n", file);
          printf("\n\tEnter commands : \n");
          fclose (sf);
          }
    }
    
    void append(){
       sf = fopen(fname,"a");
       if ( sf != NULL ) {
           fprintf(sf, "%s\n", com);
           fclose(sf);
           }
    }
    
    int main (void) {
    
     printf("Enter commands : \n");
    
     while ( strcmp(com, "quit") != 0 ) {
       printf("\t >  ");
       gets(com);
       if (sf == NULL) {
          printf("\n\tError, no script file detected.\n ");
          newfile();
          }
         append();
       }
      parser();
    return 0;
    }
    Quelques remarques en commentaires dans le code.
    Pourtant, sur le principe, ce n'est pas si compliqué :
    Jusqu'à la fin du fichier :
    - lire une ligne
    - Extraire la première chaîne de la ligne
    - Si cette chaîne est "add" ( je ne sais pas ce que tu veux faire du "add") extraire la seconde chaîne
    - recommencer
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par diogene
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static FILE *sf; // Ces globales ne sont pas justifiées . A éviter absolument!
    Que dois-je utiliser a la place ? Mes globales sont censee servir pour d'autres fonctions si tu regardes le code entierement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gets(fname); // ne pas utilier gets mais fgets sur le flux stdin
    avec fgets(fname, 81, stdin) un fichier se cree mais avec un retour a la ligne (^\0)

    output avec fgets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File "fichier1
    " created.
    avec gets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File "fichier1" created.
    Quel est le probleme ici ?

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Mes globales sont censee servir pour d'autres fonctions si tu regardes le code entierement.
    Alors on les passera en arguments de ces fonctions.
    Quel est le probleme ici ?
    gets ne garantit aucunement contre un dépassement de longueur du tableau où on stocke la ligne. C'est extrèmement dangereux pour une entrée clavier où l'utilisateur peut taper n'importe quoi.
    fgets conserve le '\n' c'est vrai. Si il te gêne, il suffit de le rechercher (strchr) et de le remplacer par '\0'. C'est embêtant mais l'inconvénient de gets justifie cet embarras.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. POO, stocker le résultat dans des variables
    Par nicolas2603 dans le forum Langage
    Réponses: 2
    Dernier message: 26/10/2012, 11h40
  2. Réponses: 3
    Dernier message: 24/10/2011, 18h45
  3. Réponses: 2
    Dernier message: 22/06/2008, 15h41
  4. Réponses: 8
    Dernier message: 16/01/2008, 17h49
  5. lecture d'un fichier.bin + affichage du contenu
    Par mitchness dans le forum C
    Réponses: 1
    Dernier message: 26/12/2007, 18h07

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