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 :

Pb de lecture dans un fichier avec la fonction fgets


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 50
    Points : 35
    Points
    35
    Par défaut Pb de lecture dans un fichier avec la fonction fgets
    Bonjou,

    J'ai un pb très blocant de lecture d'une donnée dans un fichier:

    mon main est:

    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
    int main()
    {
     
    char x[10];
    char in[10];
    FILE *fin;
     
    scanf("%s",in);
    fin=fopen(in,"r");
     
    fgets(x,10,fin);
     
    fclose(fin);
     
    printf("x vaut %s",x);
     
    }

    => le fichier en entrée contient un seul nombre (1.12) et la fonction me renvoit
    x vaut {\rtf1\ma


    alors que je m'attends à x vaut 1.12 !!

    où est mon erreur?

    Marci

    Edit : merci de penser a la balise code

  2. #2
    Bob
    Bob est déconnecté
    Membre averti
    Avatar de Bob
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Points : 378
    Points
    378
    Par défaut
    Tu es sur que la lecture dans le fichier a bien lieu ?
    Deja, alloue plus que 10 octets pour ton tableau in
    Ensuite verifie les retour de fopen() et de fgets() pour etre sur que la lecture fonctionne.
    Bob, Rédacteur C/C++ & PHP
    http://bob.developpez.com/

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Pb de lecture dans un fichier avec la fonction fgets

    Code incomplet. Merci de poster du code compilable.
    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
     
    main.c: In function `main_':
    main.c:12: error: `FILE' undeclared (first use in this function)
     
    main.c:12: error: (Each undeclared identifier is reported only once
    main.c:12: error: for each function it appears in.)
    main.c:12: error: `fin' undeclared (first use in this function)
    main.c:14: error: implicit declaration of function `scanf'
    main.c:14: warning: nested extern declaration of `scanf'
    <internal>:0: warning: redundant redeclaration of 'scanf'
    main.c:15: error: implicit declaration of function `fopen'
    main.c:15: warning: nested extern declaration of `fopen'
    main.c:17: error: implicit declaration of function `fgets'
    main.c:17: warning: nested extern declaration of `fgets'
    main.c:19: error: implicit declaration of function `fclose'
    main.c:19: warning: nested extern declaration of `fclose'
     
    main.c:21: error: implicit declaration of function `printf'
    main.c:21: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    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
     
    int main()
    {
    char x[10];
    char in[10];
    FILE *fin;
     
    scanf("%s",in);
    fin=fopen(in,"r");
     
    fgets(x,10,fin);
     
    fclose(fin);
     
    printf("x vaut %s",x);
     
    }
    => le fichier en entrée contient un seul nombre (1.12) et la fonction me renvoit
    alors que je m'attends à x vaut 1.12 !!

    où est mon erreur?
    • Manque <stdio.h>
    • fopen() peut échouer (NULL).
    • main() retournant un int, il faut un return 0,; par exemple (mais facultatif en C99)

    Avec le fichier texte 'xx':
    et ce 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
     
    #include <stdio.h>
     
    int main (void)
    {
       int err = 1;
       char in[10];
       char x[10];
       int n = scanf ("%s", in);
     
       if (n == 1)
       {
          FILE *fin = fopen (in, "r");
     
          if (fin != NULL)
          {
             if (fgets (x, sizeof x, fin) != NULL)
             {
                err = 0;
             }
     
             fclose (fin);
          }
          else
          {
             perror (in);
          }
       }
     
       if (!err)
       {
          printf ("x vaut %s\n", x);
       }
       return 0;
    }
    Ca fonctionne :
    Je ne recommande pas scanf() pour les saisies (ici, l'usage que tu en fais est très dangereux).

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ton fichier n'est pas un fichier texte, mais un .rtf (qui contient plein de balises de mise en forme)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    le fichier en entrée contient un seul nombre (1.12) et la fonction me renvoie
    sous quelle forme ? binaire ou ASCII ?
    C'est-à-dire si tu fais un type du fichier qu'obtiens-tu à l'écran ?
    "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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    pardonnez-moi ma curiosité, mais:
    quel est l'intérêt du [scanf("%s",in);] au début du code ? (1er post).


    je l'aurais écrit:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #include <stdio.h>
    int main(void) 
    { 
    char x[10]; 
     
    FILE *fin; 
    fin=fopen(in,"r"); 
     
    scanf("%s",x); 
    fclose(fin); 
     
    printf("x vaut %s",x);
    c'est plus imple et plus clair, non ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    pardon, j'ai oublié
    . un return 0, puisque la fonction main est un int
    . le } terminal

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par artatum
    pardonnez-moi ma curiosité, mais:
    quel est l'intérêt du [scanf("%s",in);] au début du code ? (1er post).
    Il faut bien connaître le nom du fichier à ouvrir, non ? C'est à ça que sert le scanf !
    "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
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par artatum
    quel est l'intérêt du [scanf("%s",in);] au début du code ? (1er post). je l'aurais écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    int main(void) 
    { 
    char x[10]; 
     
    FILE *fin; 
    fin=fopen(in,"r"); 
     
    scanf("%s",x); 
    fclose(fin); 
     
    printf("x vaut %s",x);
    c'est plus simple et plus clair, non ?
    Et 'in' est défini comment ?
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    c'est bon, pas besoin de m'agresser, je pose des questions pour apprendre, j'ai bien dit que j'étais débutant.

    au lieu de balancer ce genre de choses vous pourriez développer, comme ça tout le monde en profiterait

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Tu parles à qui ? (merci d'utiliser le bouton [citer])
    Citation Envoyé par artatum
    c'est bon, pas besoin de m'agresser,
    Gni ? Personne ne t'a agressé. Tu proposes une solution bourrée d'erreurs, et on se contente de signaler tes erreurs. Tu préfères quoi ? Qu'on ne dise rien ?
    je pose des questions pour apprendre,
    Ok.
    j'ai bien dit que j'étais débutant.
    J'ai bien relu le fil, je n'ai rien vu de tel. Citation ?
    au lieu de balancer ce genre de choses vous pourriez développer, comme ça tout le monde en profiterait
    Quelle genre de choses ? Tu n'as pas cité le contexte.
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    d'accord, désolé je m'emporte un peu facilement quand je me sens agressé.

    donc pour en revenir à ce code, ne pourrait-on pas écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fin=fopen("nom du fichier","r");
    ?

    et le sens de ma question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pardonnez-moi ma curiosité, mais: 
    quel est l'intérêt du [scanf("%s",in);] au début du code ? (1er post).
    c'est que pour moi cette fonction signifie "doit lire une chaîne de caractère (s) dans l'entrée standard (scanf), et la mettre dans le tableau de caractère in[] (in remplaçant *in[0] ).

    donc je ne comprenais pas sa présence, d'autant plus vu sa place ds le code AVANT l'ouverture en lecture.

    éclaire-moi

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    mais comme je connais mal la fonction fgets (je l'apprends d'ailleurs en ce moment ds le K&R en lisant ce forum), je commence à comprendre,
    mea culpa.

    donc il ouvre le fichier "in", y lit x[10], (au passage referme fin et non in).

    alors pourquoi cela ne renvoie pas la bonne chaîne ? est-ce parce qu'il aurait dû écrire fopen(*in, "r") ? pourtant in est l'équivalent de *in[0], donc ça ne devrait pas poser pb.

    je ne vois pas, j'aimerais bien que Vince nous donne le retour de fopen, pour voir.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par artatum
    donc pour en revenir à ce code, ne pourrait-on pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fin=fopen("nom du fichier","r");
    On peut techniquement faire beaucoup de chose. Le problème est de respecter les specs. Je suppose que si le posteur original s'est cassé les c...ll.s à saisir le nom du fichier, c'est qu'on lui a demandé de le faire... Un programmeur qui commence à changer les specs ne fera pas long feu dans ce métier...
    et le sens de ma question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pardonnez-moi ma curiosité, mais: 
    quel est l'intérêt du [scanf("%s",in);] au début du code ? (1er post).
    De demander à l'utilisateur de rentrer le nom du fichier à traiter. On suppose que ça correspond à une demande du client.
    c'est que pour moi cette fonction signifie "doit lire une chaîne de caractère (s) dans l'entrée standard (scanf), et la mettre dans le tableau de caractère in[] (in remplaçant *in[0] ).

    donc je ne comprenais pas sa présence, d'autant plus vu sa place ds le code AVANT l'ouverture en lecture.
    Comment ouvrir un fichier dont on ne connait pas le nom ? Il me parait logique de commencer par demander le nom, et ensuite d'ouvrir le fichier, non ?

    Je te dirais un truc dans le genre 'achète toi un cerveau', mais tu risques de le prendre mal, alors je ne le dis pas! (humour).
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par artatum
    donc il ouvre le fichier "in",
    Non. Il ouvre le fichier dont le nom est dans la chaine in.
    y lit x[10], (au passage referme fin et non in).
    Il faut apprendre le sens des fonction fopen() et fclose(). Ici, in est la chaine qui contient le nom du fichier, alors que fin est le nom du pointeur sur l'objet FILE crée par fopen(), et s'utilise ensuite dans les fonctions de fichier, y compris fclose().
    alors pourquoi cela ne renvoie pas la bonne chaîne ? est-ce parce qu'il aurait dû écrire fopen(*in, "r") ? pourtant in est l'équivalent de *in[0], donc ça ne devrait pas poser pb.

    je ne vois pas, j'aimerais bien que Vince nous donne le retour de fopen, pour voir.
    STP. Relis ton K&R au chapitre sur les I/O (chap. 7), fait les exercices et revient avec des questions qui montrent que tu as lu le bouquin... On est pas là pour t'enseigner les bases qui se trouvent dans les bouquins.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    il n'y a rien de plus horrible que de relire ce qu'on a écrit & de voir ses erreurs.... bon d'accord.


    et je ne connais pas le K&R par coeur, d'abord parce que cela ne fait pas longtemps que je me suis mis au C, ensuite parce que je n'ai pas que ça à faire.

    enfin bon, une fois que mes innombrables erreurs & ignorances sont corrigées et que l'on a rendu à César ce qui appartient à César, répondons à la question première qui était:

    mais enfin, pourquoi est-ce que ça ne marche pas ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par artatum
    mais enfin, pourquoi est-ce que ça ne marche pas ?
    Quels sont les mots que tu ne comprends pas dans
    Tu parles à qui ? (merci d'utiliser le bouton [citer])
    et j'ajoute "tu parles de quoi ?"
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    bon, laissons tomber ça devient stérile.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par artatum
    bon, laissons tomber ça devient stérile.
    Si tu veux des réponses interessantes, fait au moins l'effort de lire les regles du forum et de les appliquer.
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    et ? je ne vois pas en quoi je contreviens aux règles du forum, que j'ai lues bien évidemment.

    Tu trouves mes questions débiles, c'est ton droit, maintenant j'attendais une autre attitude. dans mon travail la connaissance théorique est indispensable, c'est la base de tout savoir, mais rien ne remplace ce que peut t'apporter un Maître, car lui seul a la possibilité d'imprimer de façon indélébile ses connaissances au fond de ton esprit.

    C'est avec des explications pédagogiques et de la patience que l'on devient un Maître, pas de cette façon. taper du code, tout le monde peut l'apprendre, et j'espère bien y arriver un jour de façon satisfaisante.

    Enfin pour terminer, quand on pose une question c'est qu'on cherche une réponse, et quand je soumets un post avec des erreurs, ce qui doit souvent arriver pour l'instant dans ce langage, j'attends autre chose que "retourne lire et achète-toi un cerveau".

    ça me fait un peu penser aux gamins SMS d'un autre forum, qui s'envoient en permanence des "boulet tu sors".

    sur ce, je ne lirai plus toute réponse postée à la suite sur ce topic.
    j'aimerais bien continuer à apprendre, à poser des questions, des questions idiotes même, et qu'on me corrige. mais j'aimerais que les réponses viennent de quelqu'un qui veuille corriger, pas envoyer bouler.

    merci.

Discussions similaires

  1. Ecrire dans un fichier avec une fonction itérative.
    Par katcha95 dans le forum Débuter
    Réponses: 6
    Dernier message: 22/11/2009, 18h40
  2. Réponses: 4
    Dernier message: 25/11/2008, 18h03
  3. Lecture dans un fichier (avec tableau)
    Par whytipi dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/07/2008, 12h42
  4. Lecture dans un fichier avec lseek
    Par Maria1505 dans le forum Linux
    Réponses: 8
    Dernier message: 24/02/2007, 12h29
  5. Ecriture dans un fichier avec la fonction AWK
    Par tux2005 dans le forum Linux
    Réponses: 2
    Dernier message: 21/07/2005, 10h58

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