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 :

Où placer le feof(fi_in) ?


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut Où placer le feof(fi_in) ?
    Bonjour,

    J'ai écris un simple petit programme qui recopie le contenu d'un fichier dans un autre.
    Il prend donc en paramètre le nom du fichier à copier.

    Je me demandais où il fallait placer le feof().
    Dans les FAQ il est mit après la boucle while qui parcourt le fichier.
    Moi je l'ai mis dedans.

    Est-ce que celà a-t-il un sens ?

    Moi j'estime qu'il faut tester que tout ailles bien avant chaque lecture d'une nouvelle ligne.

    Merci.

    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
     
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <errno.h>
      4 
      5 #define LEN 200
      6 
      7 int main(int argc, char** argv ){
      8 
      9         FILE* fi_in ;
     10         FILE* fi_out ;
     11         char* ligne ;
     12         
     13         ligne = malloc( sizeof(char)*LEN );
     14         if( ( fi_in = fopen(argv[1], "r" ) ) == NULL ){
     15                 fprintf(stderr,"Erreur fopen de fi_in %d\n", errno);
     16                 exit (1) ;
     17         }
     18         if( (fi_out = fopen("fichierOut.txt","w+" )) == NULL){
     19                 fprintf(stderr,"Erreur fopen de fi_out %d\n", errno);
     20                 exit(2);
     21         }
     22 
     23         while( ( fgets( ligne, LEN, fi_in ) != NULL ) ){
     24                 if( feof(fi_in) ){
     25                         exit (3) ;
     26                         fprintf(stderr, "Erreur de fin de fichier %d\n", errno);
     27                 }
     28                 fputs(ligne, fi_out);
     29         }
     30         fclose(fi_in);
     31         fclose(fi_out);
     32 
     33 }

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

    Moi j'estime qu'il faut tester que tout ailles bien avant chaque lecture d'une nouvelle ligne.
    Et non, feof et ferror sont deux fonctions à appeler pour savoir quelle est la cause de l'échec d'une fonction de lecture comme fgetc, fgets...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FILE *f = fopen(...)
    if(NULL != f) {
        while(NULL != fgets(..., f)) {
            /* faire quelque chose des données lues... */
        }
        if(feof(f)) {
            printf("lecture du fichier terminée\n");
        }
        if(ferror(f)) {
            perror("erreur pendant la lecture\n");
        }
        fclose(f);
    }
    Dans ton cas, on écrirait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while( ( fgets( ligne, LEN, fi_in ) != NULL ) ){
        fputs(ligne, fi_out);
    }
    if(feof(fi_in)) {
        fprintf(stderr, "lecture du fichier terminée\n");
    }
    if(ferror(fi_in)) {
        perror("erreur pendant la lecture");
    }

  3. #3
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par Despak
    Moi je l'ai mis dedans.
    à l'intérieur de la boule le test ne sert à rien car si le corps de la boucle est exécuté cela signifie qu'aucunes erreurs n'a été rencontrée ( fgtes() retourne une valeur autre que NULL ) le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    exit (3) ;
    fprintf(stderr, "Erreur de fin de fichier %d\n", errno);
    ne sera jamais exécuté
    Citation Envoyé par Despak
    Moi j'estime qu'il faut tester que tout ailles bien avant chaque lecture d'une nouvelle ligne.
    c'est ce que tu faits avec le test du retour de fgets, si quelque chose ne va pas on sort de la boucle et c'est à ce moment qu'il faut vérifier la nature de l'erreur ( une fin de fichier entre autres ).

  4. #4
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut
    AAAh ok !

    J'ai tout compris, merci beaucoup !

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

Discussions similaires

  1. recuperer date dans un batch et la placer en variable
    Par Phenomenium dans le forum Windows
    Réponses: 6
    Dernier message: 07/06/2004, 10h44
  2. [TOMCAT][XML] Ou placer les fichiers XML ?
    Par kitov dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 01/06/2004, 14h29
  3. [C#] Placer fichier html entre balises DIV
    Par Febus dans le forum ASP.NET
    Réponses: 9
    Dernier message: 07/05/2004, 11h44
  4. Réponses: 3
    Dernier message: 12/03/2004, 19h34
  5. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58

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