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 :

Problème de lecture


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Par défaut Problème de lecture
    Bonjour !

    Voila le soucis qui me tient en haleine depuis un ptit moment.

    J'ai une fonction me permettant de lire chaque caractère d'un fichier et de placer ce qui est entre mes délimiteurs dans des variables temporaires. Puis, le contenu des variables interressante cera recopier dans des variables dur !

    Voici le code :

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>  
    void exo1(void);  
     
    int main (void)
    {
      int choix=0, exit=0;
      while((choix==0)&&(exit==0)) 
      {
     
        printf("1. truc test\n");
        printf("4. Quitter l'application\n\n");
     
        printf("Saisir votre choix : ");
        scanf("%d",&choix);
     
        switch (choix)
        {
          case 1 : exo1();
                   break;
          case 4 : exit=1;
                   break;   
          default : printf("Erreur de saisie\n");
                   break;
        }
        choix=0;
      }       
    }  
     
     
    void exo1(void) 
    { 
    // Pré-traitement
      FILE *file; 
      char Buffer[200]; 
      char carac;
      char litnb[5];
      int i,j;
      int lu;
      int nblignes;
     
    /* - Déclaration pour le tri des informations - */
      char    *pointeur;  //variable dans laquel on stocke l'adresse de la séléction
      char    *separateur = { ":;" }; // Le séparateur 
      int      nbVar;
      char     tempo[30];
      char     var[38][30];
     
    // Traitement
      printf("\ndebut\n");   
      if((file = fopen("donne", "r")) != NULL) //on ouvre le fichier et verifie si on y arrive 
      { 
        while (lu != 0)
        {
          lu=fread(litnb, 4, 1, file); //on range les caractere dans le buffer 
          litnb[4] = '\0';
          i=0;
          do 
          { 
     
            lu=fread(&carac, 1, 1, file); //on range les caractere dans le buffer 
            if(lu != 0)
            {
              Buffer[i++] = carac;
            }
          } while ((carac != '\n')&&(lu != 0));
     
          if(lu != 0)
          {
             Buffer[--i]='\0';
             printf("%s\n", Buffer); //on affiche ce que contient le buffer 
          }
          /* - Tri de la ligne lu - */
     
          pointeur = strtok( Buffer, separateur ); 
          strcpy(var[0],pointeur); //copie ce qui est pointé par pointeur dans tempo[0]
     
          nbVar=1;
          while( pointeur != NULL ) 
          { 
         // Cherche les autres separateurs 
            pointeur = strtok( NULL, separateur ); 
            if ( pointeur != NULL ) 
            {    
              strcpy(var[nbVar],pointeur); //copie ce qui est pointé par pointeur dans var[nbVar]
              nbVar++;  //incremente le numéro de nbVar
            } 
          } 
     
        }
     
        fclose(file); 
      }
      nblignes = atoi(litnb);
      printf("nblignes : %s",litnb);
      printf("nblignes : %d",nblignes);
     
      printf("\n");
      for(i=0;i<20;i++)
      {
        printf("var %d : %s\n",i,var[i]);
      }
     
     
    // Post-traitement
      printf("\nfin\n");
     
    }
    Je n'ai aucun problème de compilation, tout ce fait correctement sauf que le premier caractère du fichier n'est pas lu !

    En effet, voici ce que doit lire la focntion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    232
    16:23:45;a0:1024,1023,1000,1003,1023;a1:?,?,?,?,?;a2:?,?,?,?,?;a3:3001,3003,3002,3003,3002;t:01?1001??01?0101
    Et là, c'est le drame, car il ne m'affiche pas 232 mais 32 ....

    Je ne comprend pas, j'ai tenter de replacer le pointeur au début du fichier, cela n'a rien changé ... ou alors, c'est que je me suis trompé !

    Voili, si vous avez des ptits trucs a me dire ...

    Merci !

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Par défaut
    bonjour,


    je n ai pas lu ton code desolé, mais tu trouveras sur le net des fonctions split toutes faite, inspire toi en. ca ira peut etre beaucoup plus vite.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    C'est du C ce que tu fais, même si tu inclues le header <string> que tu n'utilises pas.

  4. #4
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Citation Envoyé par Miles
    C'est du C ce que tu fais, même si tu inclues le header <string> que tu n'utilises pas.
    Même pas, c'est juste l'en-tête <string.h> qui continet les fonctions C pour manipuler les char* .

  5. #5
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    jerome@linux:~/tmptest> ./aide
    1. truc test
    4. Quitter l'application

    Saisir votre choix : 1

    debut
    nblignes : 232nblignes : 232
    var 0 : 16
    var 1 : 23
    var 2 : 45
    var 3 : a0
    var 4 : 1024,1023,1000,1003,1023
    var 5 : a1
    var 6 : ?,?,?,?,?
    var 7 : a2
    var 8 : ?,?,?,?,?
    var 9 : a3
    var 10 : 3001,3003,3002,3003,3002
    var 11 : t
    var 12 : 01?1001??01?0101F@
    var 13 :
    var 14 :
    var 15 :
    var 16 :
    var 17 :
    var 18 :
    var 19 : @`G@

    fin
    1. truc test
    4. Quitter l'application

    Saisir votre choix :
    Voici ce que j'obtient en executant ton programme, il me donne bien 232.
    ton fichier donne a bien cette forme ?
    232
    16:23:45;a0:1024,1023,1000,1003,1023;a1,?,?,?,?;a2 ,?,?;a3:3001,3003,3002,3003,3002;t:01?1001??01?0101
    ça n'a rien avoir avec ton problème, mais tu as oublié un return à la fin de ton main.

  6. #6
    Membre expérimenté Avatar de damienlann
    Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2005
    Messages : 293
    Par défaut
    ta variable lu n'est pas initialiser... ca vient peut etre de là.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Par défaut
    Et bien tout d'abord, je vous remercie !

    J'utilise comme compilateur Dev C++, n'y aurait t-il pas un problème avec ce compilateur ?

    J'ai tenté de mettre lu à 0, il par en vrille le pauvre ....

    Je vous remercie de l'avoir testé

    Si ya du nouveau, je vous fait signe !

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Nelmo
    J'ai tenté de mettre lu à 0, il par en vrille le pauvre ....
    Je pense qu'il faudrait le mettre à 1 à la place de 0 vu le test while que tu fais... Ensuite ton code fonctionne chez moi, il affiche bien 232 au début...

    Jc

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Par défaut
    Arf, sa venait de mon fichier qui devait être mal luné ...

    Tout fonctionne, je vous remercie pour votre rapidité

    Bye,

    Cordialement

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nelmo
    Voici le code :
    Je n'ai aucun problème de compilation,
    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
     
    Compiling: main.c
    main.c: In function `main_':
    main.c:8: warning: declaration of 'exit' shadows a global declaration
    C:/Program Files/CodeBlocks/include/stdlib.h:355: warning: shadowed declaration is here
    main.c: In function `exo1':
    main.c:45: warning: initialization discards qualifiers from pointer target type
    main.c:39: warning: unused variable `j'
    main.c:47: warning: unused variable `tempo'
    main.c:40: warning: 'lu' might be used uninitialized in this function
    main.c: In function `main_':
    main.c:29: warning: control reaches end of non-void function
    Linking console executable: D:\dev\ed02\cb\ed02.exe
    Process terminated with status 0 (0 minutes, 7 seconds)
    0 errors, 7 warnings
    A part ça, c'est bien joli d'utiliser while(), mais si l'état des variables de l'expression est indéterminé, ça ne va pas fonctionner...

    De toutes façons, ton codage est abominable.

    Il faut travailler en couches. C'est un fichier texte, alors
    1 lire les lignes
    2 traiter les lignes.
    Pour ça, on utilise fgets().

    Réorganisation et simpification de ton code... (évidemment, il manque un tas de sécurités, mais la base est correcte).
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define DBG  0
     
    static void purge(FILE *fp)
    {
       int c;
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          purge (fp);
       }
    }
     
     
    static void line2(char *line)
    {
       char var[38][30] =
          {
             {
                0}
          };
       char *pointeur;  //variable dans laquel on stocke l'adresse de la séléction
       char const *separateur = { ":;" };
       int nbVar;
     
       /* - Tri de la ligne lu - */
       pointeur = strtok( line, separateur );
       strcpy(var[0], pointeur); //copie ce qui est pointé par pointeur dans tempo[0]
       nbVar = 1;
       while ( pointeur != NULL )
       {
          // Cherche les autres separateurs
          pointeur = strtok( NULL, separateur );
          if ( pointeur != NULL )
          {
             strcpy(var[nbVar], pointeur); //copie ce qui est pointé par pointeur dans var[nbVar]
             nbVar++;  //incremente le numéro de nbVar
          }
       }
     
       printf("\n");
       {
          int i;
          for (i = 0;i < 20;i++)
          {
             printf("var %d : %s\n", i, var[i]);
          }
       }
    }
     
    static void exo1(void)
    {
       int nblignes = 0;
       FILE *fp = fopen("donne", "r");
     
       if (fp != NULL) //on ouvre le fichier et verifie si on y arrive
       {
          int count = 0;
          char line[256];
          while (fgets(line, sizeof line, fp) != NULL)
          {
             clean (line, fp);
             count++;
    #if DBG
     
             printf ("[%d] '%s'\n", count, line);
    #endif
     
             switch (count)
             {
             case 1:
                /* process line 1 */
                nblignes = strtol(line, NULL, 10);
                break;
             case 2:
                /* process line 2 */
                line2(line);
                break;
             }
          }
          fclose (fp), fp = NULL;
       }
       printf("nblignes : %d\n", nblignes);
    }
     
    int main (void)
    {
       int end = 0;
     
       do
       {
          int choix;
          printf("1. truc test\n");
          printf("4. Quitter l'application\n\n");
          printf("Saisir votre choix : ");
          scanf("%d", &choix);
          switch (choix)
          {
          case 1 :
             exo1();
             break;
          case 4 :
             end = 1;
             break;
          default :
             printf("Erreur de saisie\n");
             break;
          }
       }
       while (!end);
     
       return 0;
    }
    Pose des questions si tu ne comprends pas.
    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
     
    1. truc test
    4. Quitter l'application
     
    Saisir votre choix : 1
     
    var 0 : 16
    var 1 : 23
    var 2 : 45
    var 3 : a0
    var 4 : 1024,1023,1000,1003,1023
    var 5 : a1
    var 6 : ?,?,?,?,?
    var 7 : a2
    var 8 : ?,?,?,?,?
    var 9 : a3
    var 10 : 3001,3003,3002,3003,3002
    var 11 : t
    var 12 : 01?1001??01?0101
    var 13 :
    var 14 :
    var 15 :
    var 16 :
    var 17 :
    var 18 :
    var 19 :
    nblignes : 232
    1. truc test
    4. Quitter l'application
     
    Saisir votre choix : 4
     
    Press ENTER to continue.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [débutant] problème de lecture d'image
    Par shura dans le forum OpenGL
    Réponses: 16
    Dernier message: 03/07/2004, 18h05
  2. [TFileStream] Problème de lecture de string
    Par Pedro dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2004, 13h06
  3. problème de lecture base de registre
    Par pafounet3 dans le forum MFC
    Réponses: 10
    Dernier message: 31/12/2003, 14h06
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

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