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 de fichier


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut Lecture de fichier
    SVP, Dites moi si vous voyez mon erreur, car celà m'afficher toutes les valeurs
    que j'ai dans mon fichier de lecture et il repète la dernière valeur
    alors qu'il est déjà rendu à la fin du fichier


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int entier;
    FILE *fichier;
    fichier = fopen(argv[1], "r");
    if (fichier != NULL)
       {
    	while ( !feof(fichier) ) { //On lit le fichier tant que c'est pas la fin
     
    		fscanf(fichier, "%d", &entier);
    		printf("%d\n", entier);
     
    	}
       }
    fclose(fichier);

    voilà le contenu de mon fichier
    3 4 5 6 2 2 3 4 5 1 2 5

    voilà l'affichage
    3
    4
    5
    6
    2
    2
    3
    4
    5
    1
    2
    5
    5



    Merci à tous

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pourquoi ne pas tester directement la valeur de retour de fscanf ?

    A mon sens, le problème vient justement de là.
    Tester via feof() va t'indiquer à un instant T si le fichier que tu lis est EOF. Le soucis avec cette manière de faire, c'est que si il reste une crasse dans le fichier, après ton dernier nombre, un \n par exemple, le fichier ne sera pas considéré comme EOF. Du coup tu repasses dans le fscanf(), qui lui fera bien gentiment son boulot. Il ne va pas lire la valeur restante car ce n'est pas un nombre et arrivera sur EOF, laissera donc inchangé le contenu de la variable entier, et retournera la valeur d'erreur EOF. Comme tu ne vérifies pas ce retour, il affiche sans encombre le printf().

    Pour reprendre ton exemple à toi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ( !feof(fichier) ) { //On lit le fichier tant que c'est pas la fin
                if(fscanf(fichier, "%d", &entier) != EOF)
                    printf("%d\n", entier);
            }
    Affiche bien en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ~/Bureau$ ./popo
    3
    4
    5
    6
    2
    2
    3
    4
    5
    1
    2
    5
    Qui peut avantageusement être remplacé par ceci, qui est à mes yeux plus propres encore.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ( fscanf(fichier, "%d", &entier) != EOF )
        printf("%d\n", entier);

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par archMqx. Voir le message
    A mon sens, le problème vient justement de là.
    Tester via feof() va t'indiquer à un instant T si le fichier que tu lis est EOF. Le soucis avec cette manière de faire, c'est que si il reste une crasse dans le fichier, après ton dernier nombre, un \n par exemple, le fichier ne sera pas considéré comme EOF. Du coup tu repasses dans le fscanf(), qui lui fera bien gentiment son boulot. Il ne va pas lire la valeur restante car ce n'est pas un nombre et arrivera sur EOF, laissera donc inchangé le contenu de la variable entier, et retournera la valeur d'erreur EOF. Comme tu ne vérifies pas ce retour, il affiche sans encombre le printf().Qui peut avantageusement être remplacé par ceci, qui est à mes yeux plus propres encore.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ( fscanf(fichier, "%d", &entier) != EOF )
        printf("%d\n", entier);
    C'est même pas une question de crasse ou autre. Même avec un fichier super correct ça ne peut pas fonctionner parce que feof() indique si le fichier est eof non pas au dernier enregistrement mais une fois qu'on a tenté de lire au-delà de ce dernier (quand on lit un livre on ne sait pas qu'on est à la dernière page tant qu'on n'a pas essayé de regarder la suivante). En effet, feof() ne sert pas à détecter une fin de fichier. Il sert à indiquer, une fois que la lecture s'est arrêtée, si l'arrêt est dû à une fin de fichier ou pas (donc autre chose comme par exemple une erreur disque ou autre).

    Il s'ensuit que si tu fais un
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (feof(...))
    {
        lecture_fichier(...)
       ... traitement...
    }
    Au moment où tu liras le dernier élément de ton fichier, cet élément ayant été correctement lu (et traité), feof() ne renverra aucun soucis. Tu feras alors une itération de plus ce qui amènera une lecture de plus ; lecture se faisant au delà du fichier donc te renvoyant un code d'état spécial mais que tu ne verras pas et donc tu feras un traitement de trop par rapport au nombre d'éléments de ton fichier.

    Une première solution sera alors de vérifier l'abscence de ce code spécial pour faire ou ne pas faire le traitement
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (feof(...))
    {
        if (lecture_fichier(...) != code_special)
           ... traitement...
    }
    Mais de là, on peut se dire que si la fonction de lecture renvoie un code spécial quand elle lit "trop loin", on peut alors directement l'utiliser pour vérifier justement qu'on n'est pas allé "trop loin" et ne plus se servir de feof(), ce qui donne
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (lecture_fichier(...) != code_special)
    {
        ... traitement...
    }
    Ce qui est exactement ta solution avec ton while ( fscanf(fichier, "%d", &entier) != EOF )...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Invité
    Invité(e)
    Par défaut
    Comme quoi, on apprends toujours plus de ses maîtres...


  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Points : 97
    Points
    97
    Par défaut Re
    Merci beaucoup à vous deux pour l'explication...

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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