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 :

feof et fichier texte sous unix


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Par défaut feof et fichier texte sous unix
    Bon voila mon petit probleme.
    En ne gardant que l'essentiel, j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(!feof(fichier1) && !feof(fichier2))
    {
       char* temp1=(char*)malloc(MAX_SIZE);
       char* temp2=(char*)malloc(MAX_SIZE);
       fgets(temp1,MAX_SIZE,fichier1);
       fgets(temp2,MAX_SIZE,fichier2);
     
       if(strcmp(temp1,temp2))
          printf("%s%s\n",temp1,temp2);
    }
    Dans mon fichier1 j'ai par exemple :
    Dans mon fichier2 :
    Alors ma sortie est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    1
    a
     
    2
    b
     
    3
    c
     
     
    d
    Le prog rentre donc 4 fois dans la boucle alors que le fichier1 n'a que 3 lignes (pas de ligne vide derrière). Quelqu'un saurait-il pourquoi ?

    Merci

  2. #2
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    man fgets.

    Si fgets() lit un EOF avant autre chose, il retourne NULL. Mais apparement il laisse un \n dans ton buffer.... Ou alors il y a bien un '\n' dans ton fichier.

    Testes la valeur de retour de fgets.

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    feof m'est pas prévu pour ça :
    Comment détecter une fin de fichier ?
    Les fichiers

  4. #4
    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 Re: feof et fichier texte sous unix
    Citation Envoyé par Magicmax
    Bon voila mon petit probleme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(!feof(fichier1) && !feof(fichier2))
    STOP ! feof() ne fait pas ce que tu crois. Il faut tester la valeur retournée par la fonction de lecture.

    http://emmanuel-delahaye.developpez....s.htm#fichiers

  5. #5
    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 Jack_serious
    Si fgets() lit un EOF
    Attention. Ce genre d'explication floue induit le débutant en erreur. Il n'y a pas de mystérieux caractère EOF dans un fichier si indiquerait une hypothétique fin de fichier [1].

    Ce qui se passe en réalité, c'est qu'un un moment donné (fin de fichier, erreur de lecture) la fonction de lecture retourne une valeur qui indique 'fin de lecture'.
    Testes la valeur de retour de fgets.
    Oui.

    ---------------------------
    [1] Confusion entretenue par le bien réel caractère ^Z (0x1A) des fichiers MS-DOS/Windows interprété comme une fin de lecture quand le fichier est ouvert en mode texte. Mais c'est un cas très particulier lié à un système bien défini. Rien de standard.

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Par défaut
    Merci à tous, effectivement il est largement préférable de teste la valeur de retour de fgets().
    Néanmoins, petite précision: fgets affecte-t-il également NULL au pointeur qui aurait du recevoir la chaine lue si il rencontre la fin du fichier ?

  7. #7
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par Magicmax
    Merci à tous, effectivement il est largement préférable de teste la valeur de retour de fgets().
    Néanmoins, petite précision: fgets affecte-t-il également NULL au pointeur qui aurait du recevoir la chaine lue si il rencontre la fin du fichier ?
    Citation Envoyé par man fgets
    char *
    fgets(char * restrict str, int size, FILE * restrict stream);

    The fgets() function reads at most one less than the number of characters
    specified by size from the given stream and stores them in the string
    str. Reading stops when a newline character is found, at end-of-file or
    error. The newline, if any, is retained, and a `\0' character is
    appended to end the string.

    Upon successful completion, fgets() and gets() return a pointer to the
    string. If end-of-file or an error occurs before any characters are
    read, they return NULL. The fgets() and gets() functions do not distin-
    guish between end-of-file and error, and callers must use feof(3) and
    ferror(3) to determine which occurred.
    fgets() n'affecte pas NULL au buffer. Mais elle retourne NULL si elle n'a rien pu lire.

  8. #8
    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 Magicmax
    Merci à tous, effectivement il est largement préférable de teste la valeur de retour de fgets().
    Néanmoins, petite précision: fgets affecte-t-il également NULL au pointeur qui aurait du recevoir la chaine lue si il rencontre la fin du fichier ?
    Bien sûr que non. Comment pourrait-il modifier un paramètre dont il n'a pas l'adresse ? Rappel, en C, tous les passages de paramètres se font par valeur.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/08/2007, 13h54
  2. Lecture de fichiers crees sous Unix en VB6
    Par bzh_touch dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/03/2007, 17h46
  3. Comment ouvrir un fichier text sous Java ?
    Par mpascolo dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 11/10/2006, 14h59
  4. Réponses: 4
    Dernier message: 31/03/2006, 10h52

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