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'éléments dans mon fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut lecture d'éléments dans mon fichier
    Bonjour!

    J'ai crée un petit fichier nommé "Fichier1.txt", c'est un fichier qui affiche les 99 premiers nombres sur 3 colonnes...Après 3 chiffres, il retourne à la ligne. J'aimerais garder le caractère "nombre" dans ce fichier car je compte utiliser les valeurs dedans pour pouvoir faire des calculs dessus.
    Le problème, c'est que je n'arrive pas à aller rechercher les informations correctement dedans...

    Merci pour le coup de main, ça doit surement être une broutille mais ça m'énerve...

    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
    #include <stdio.h>        
    #include <stdlib.h>        
     
    int main&#40;int argc, char *argv&#91;&#93;&#41;
    &#123;
      int row,col,num,nbre1;
      void creation&#40;void&#41;;
      int lecture1 &#40;int num&#41;;
      creation&#40;&#41;;
      printf&#40;"Entrez les coordonnees des elements &#58; "&#41;;
      scanf&#40;"%d %d",&row,&col&#41;;
      printf&#40;"Vous avez choisi &#58; %d %d \n",row,col&#41;;
      num=&#40;row-1&#41;*3+col;
      printf&#40;"num = %d\n",num&#41;;
      nbre1=lecture1&#40;num&#41;;
      printf&#40;"%d \n",nbre1&#41;;
      system&#40;"PAUSE"&#41;;	
      return 0;
    &#125;
     
    int lecture1&#40;int num&#41;&#123; 
      int res;
      FILE * flux1;
      flux1=fopen&#40;"Fichier1.txt","r"&#41;;
      fseek&#40;flux1,sizeof&#40;int&#41;*&#40;num-1&#41;,SEEK_SET&#41;; //C'est ici que ça foire à mon avis
      fscanf&#40;flux1,"%d",&res&#41;;  //peut etre ici aussi...
      fclose&#40;flux1&#41;;
      return res;
    &#125;
     
    void creation &#40;void&#41;&#123;
        FILE * file1;
        file1=fopen&#40;"Fichier1.txt","w"&#41;;
        int n;
        for&#40;n=1;n<100;n++&#41;&#123;
            fprintf&#40;file1,"%-4d",n&#41;;
            n+=1;
            fprintf&#40;file1,"%-4d",n&#41;;
            n+=1;        
            fprintf&#40;file1,"%-4d\n",n&#41;;
        &#125;
        fclose&#40;file1&#41;;
    &#125;

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 940
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 940
    Points : 6 384
    Points
    6 384
    Par défaut
    Salut
    ton calcul de fseek (sizeof(int)*(num-1)) est complètement faux (en particulier il ne prend pas en compte les caractères de fin de ligne) !
    Ton fichier est organisé par lignes, dont tu dois lire des lignes avec fgets.
    Calcul le nombre de lignes à lire pour lire celle contenant le nombre rechercher puis éventuellement le nombre de scanf à faire pour lire le bon nombre de la ligne.

    Maintenant un conseil, prend un format de fichier portable, par exemple le CSV (Comma Separated Value), tu écris dans le fichier tes nombres séparés par un ';', et tu recherches tes nombres en utilisant la fonction fgets pour lire les lignes puis strtok pour pister le ';'
    Il y a plein d'exemples sur ce forum.
    Bon courage.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Je sais savoir combien de lignes entières j'ai avant mon nombre, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int nblignes;
    nblignes=row-1;
    Cependant, je ne vois pas comment je dois m'y prendre avec fgets...

  4. #4
    Membre expérimenté
    Inscrit en
    décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par gillou4
    Cependant, je ne vois pas comment je dois m'y prendre avec fgets...
    Il doit y avoir quatre trillions de messages sur le sujet dans ce forum.
    En résumé:
    - on ouvre le fichier: fopen() en mode lecture de texte ("r").
    - on crée un tableau de caractère "suffisamment grand": char ligne[200]; par exemple.
    - on boucle tant que fgets() ne renvoie pas d'erreur: while(fgets(ligne, sizeof ligne, f) != NULL).
    - pour chaque ligne, on cherche le caractère de retour à la ligne: '\n' avec strchr(). Si on le trouve, on le remplace par un '\0' pour avoir une chaine de caractères. Si on ne le trouve pas, alors notre tableau de caractere n'est pas suffisamment grand.
    - on analyse chaque ligne lue.
    - on ferme le fichier.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Sorrry mais sur ce forum, y'a pas une seule conversation dans laquelle je comprend 100% des choses écrites...J'essaie d'utiliser ta démarche mais je vois quand meme pas comment ça fonctionne ni comment implémenter ça correctement. Désolé d'être débutant comme ça...

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 940
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 940
    Points : 6 384
    Points
    6 384
    Par défaut
    Citation Envoyé par DaZumba
    Citation Envoyé par gillou4
    Cependant, je ne vois pas comment je dois m'y prendre avec fgets...
    Il doit y avoir quatre trillions de messages sur le sujet dans ce forum.
    En résumé:
    - on ouvre le fichier: fopen() en mode lecture de texte ("r").
    - on crée un tableau de caractère "suffisamment grand": char ligne[200]; par exemple.
    - on boucle tant que fgets() ne renvoie pas d'erreur: while(fgets(ligne, sizeof ligne, f) != NULL).
    - pour chaque ligne, on cherche le caractère de retour à la ligne: '\n' avec strchr(). Si on le trouve, on le remplace par un '\0' pour avoir une chaine de caractères. Si on ne le trouve pas, alors notre tableau de caractere n'est pas suffisamment grand.
    - on analyse chaque ligne lue.
    - on ferme le fichier.
    quatre trillions + 1 maintenant
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    C'est pas drole

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 940
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 940
    Points : 6 384
    Points
    6 384
    Par défaut
    Ok, Ok
    Création du fichier au format portable CSV.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void creation &#40;void&#41;&#123;
        FILE * file1;
        file1=fopen&#40;"Fichier1.txt","w"&#41;;
        int n;
      // ici tu remplis le fichier au format CSV
        for&#40;n=1;n<100;n++&#41;&#123;
            fprintf&#40;file1,"%d;",n&#41;;
            n+=1;
            fprintf&#40;file1,"%d;",n&#41;;
            n+=1;       
            fprintf&#40;file1,"%d\n",n&#41;;
        &#125;
        fclose&#40;file1&#41;;
    &#125;
    Lecture
    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
    // si num est le numro du nombre à lire
    // nbl = num / 3 est le nombre de lignes à lire
    // nbnum = num % 3 est le nième nombre à lire de cette ligne
    int lecture1&#40;int num&#41;&#123;
      int res;
      FILE * flux1;
      char tmp&#91;256&#93;;
      char *p;
      int nbl, nbnum, i;
     
      nbl = num / 3;
      nbnum = num % 3
      flux1=fopen&#40;"Fichier1.txt","r"&#41;;
     
      i = 0;
      do
      &#123;
         p = fgets&#40;tmp, sizeof&#40;tmp&#41;, flux1&#41;;
         i ++;
      &#125;
      while &#40;i < nbl && p != NULL&#41;;
     
      fclose&#40;flux1&#41;;
     
      on initialise res à une valeur signalant un echec
      res = <valeur_erreur>
      // la lecture à réussi
      if &#40;p != NULL&#41;
      &#123;
          if &#40;nbnum == 0&#41;
          &#123;
             res = strtol&#40;tmp, NULL, 10&#41;;
          &#125;
          else
          &#123;
             // on recherche le premier ;
             p = strchr&#40;tmp, ';'&#41;;
             // si le premier ; est présent
             if &#40;p != NULL&#41;
             &#123;
                 if &#40;nbnum == 1&#41;
                 &#123;
                     res = strtol&#40;p+1, NULL, 10&#41;;
                 &#125;
                 else
                 &#123;
                     // on recherche le deuxième ;
                    p = strchr&#40;p+1, ';'&#41;;
                    if &#40;p != NULL&#41;
                    &#123;
                        res = strtol&#40;p+1, NULL, 10&#41;;
                    &#125;
                 &#125;
             &#125;
          &#125;
      &#125;
     return res;
    &#125;
    Si tu ne comprends pas tout, regarde les doc en ligne en tapant sur Google le nom des fonctions, ou pose des questions pour l'algo.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Membre expérimenté
    Inscrit en
    décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par gillou4
    J'essaie d'utiliser ta démarche mais je vois quand meme pas comment ça fonctionne ni comment implémenter ça correctement.
    Bien. Si je comprends bien ton problème, tu souhaites aller chercher une ligne particulière dans ton fichier, puis la valeur d'une colonne de cette ligne.
    La solution simple serait d'utiliser fscanf(), puisque ton fichier est fortement formatté. Mais utilisons une méthode plus générale:
    On ouvre le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FILE *f;
    char filename&#91;&#93; = "myfile.txt";
    f = fopen&#40;filename, "r"&#41;;
    if&#40;!f&#41;
    &#123;
       fprintf&#40;stderr, "Could not open %s.\n", filename&#41;;
       return EXIT_FAILURE;
    &#125;
    Là, on est sûr que le fichier est ouvert. On va le lire ligne 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
    31
    32
    33
    34
    35
     
    char line&#91;200&#93;;
    char *p;
    int i_line = 0;
    int n&#91;3&#93;;
     
    while&#40;fgets&#40;line, sizeof line, f&#41;&#41;
    &#123;
       i_line++;
        /*
         * on a lu une ligne. On cherche la fin de cette ligne.
         */
       p = strchr&#40;line, '\n'&#41;;
       if&#40;!p&#41;
       &#123;
           fprintf&#40;stderr, "Line %d of file %s is too long &#40;%d char max&#41;\n",
                   i_line, filename, &#40;int&#41; sizeof line&#41;;
           fclose&#40;f&#41;;
           return EXIT_FAILURE;
       &#125;
     
       /*
        * on transforme le tableau line en chaîne de caractère
        */
       *p = '\0';
     
      /*
       * on analyse la ligne -> dépend de l'application.
       * ici, on suppose qu'elle contient trois chiffres
       */
      sscanf&#40;line, "%d %d %d", n+0, n+1, n+2&#41;;
     
    &#125;
     
    fclose&#40;f&#41;;
    Evidemment, à toi d'adapter ce schéma à ton cas particulier.

    (TrapD m'a battu sur ce coup-là!)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci à vous, ça marche!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/04/2005, 15h09
  2. Problème lecture de nombre dans un fichier en c++
    Par knecmotet dans le forum C++
    Réponses: 1
    Dernier message: 28/10/2004, 15h48
  3. __declspec(dllexport) dans mon fichier header mais...?
    Par Jasmine dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 03/03/2004, 18h00
  4. Réponses: 14
    Dernier message: 01/12/2003, 17h47
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

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