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 :

EOF d'un fichier binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Par défaut EOF d'un fichier binaire
    salut ,
    je suis entrain d'ecrire un programme qui utilise les fichiers binaire ,le problème c'est que le compilateur n'arrive pas à reconnaître la fin de mon fichier.
    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>
    #include <stdlib.h>
    main()
    {
    FILE *f;
    f=fopen("personne.bin","x+");
    int i;
    printf("donner i");
    scanf("%d",&i);
    fwrite(&i,sizeof(int),1,f);
    while(fread(&i,sizeof(int),1,f) != EOF)
    printf("la valeur est %d",i);
    }
    merci d'avance

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Par défaut
    Bonjour,

    Comment ça le COMPILO arrive pas à trouver la fin du fichier? L'erreur apparait au moment de la compilation ou de l'exécution?

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par blayck Voir le message
    salut ,
    je suis entrain d'ecrire un programme qui utilise les fichiers binaire ,le problème c'est que le compilateur n'arrive pas à reconnaître la fin de mon fichier.
    Code c : 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>
    #include <stdlib.h>
    main()
    {
    FILE *f;
    f=fopen("personne.bin","x+");
    int i;
    printf("donner i");
    scanf("%d",&i);
    fwrite(&i,sizeof(int),1,f);
    while(fread(&i,sizeof(int),1,f) != EOF)
    printf("la valeur est %d",i);
    }

    merci d'avance
    Salut

    C'est peut-être parce que la fonction fread() n'est pas sensée renvoyer EOF mais le nombre d'éléments lus. Donc quand elle ne lit plus rien (ou qu'elle arrive en bout et qu'elle ne lit que la portion finale du fichier) elle renvoie un nombre plus petit que le nombre d'éléments demandés...

    Accessoirement encadre ton code entre balises "code" plutôt que "quote". Et évite de venir poser des questions sans avoir au-moins lu la doc des fonctions que tu mets en cause...

    Citation Envoyé par baccali Voir le message
    Bonjour,

    Comment ça le COMPILO arrive pas à trouver la fin du fichier? L'erreur apparait au moment de la compilation ou de l'exécution?
    Petit lapsus...
    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
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut

    C'est peut-être parce que la fonction fread() n'est pas sensée renvoyer EOF mais le nombre d'éléments lus. Donc quand elle ne lit plus rien (ou qu'elle arrive en bout et qu'elle ne lit que la portion finale du fichier) elle renvoie un nombre plus petit que le nombre d'éléments demandés...

    Accessoirement encadre ton code entre balises "code" plutôt que "quote". Et évite de venir poser des questions sans avoir au-moins lu la doc des fonctions que tu mets en cause...



    Petit lapsus...
    merci pour votre réponse,est ce vous avez une solution à me suggérer ? et je suis censé mettre quoi au lieu de (!=EOF).
    Et désolé pour tout je suis nouveau sur le forum et je suis un amateur en programmation.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Par défaut
    bonjour,
    l'erreur apparaît au moment de l’exécution.

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Par défaut
    Ok alors j'avais pas vu mais Sve@r t'as donné la solution. Utilises plutôt feof() ou ferror().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while ( fread(...) )
    {
     fprintf(...);
    }
     
    if ( ferror() )
    {
     /*
      * y'a eut une erreur!
      */
    }
    Cordialement

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par blayck Voir le message
    Citation Envoyé par Sve@r Voir le message
    Donc quand elle ne lit plus rien (ou qu'elle arrive en bout et qu'elle ne lit que la portion finale du fichier) elle renvoie un nombre plus petit que le nombre d'éléments demandés...
    merci pour votre réponse,est ce vous avez une solution à me suggérer ? et je suis censé mettre quoi au lieu de (!=EOF).
    La réponse était pourtant dans mon post...

    Citation Envoyé par baccali Voir le message
    Ok alors j'avais pas vu mais Sve@r t'as donné la solution. Utilises plutôt feof() ou ferror().
    NON !!!
    feof() ou ferror() ne servent pas à détecter la fin du fichier. Elles servent, une fois que la fonction de lecture ne lit plus rien, à détecter si la fin de lecture est due à une fin de fichier (feof()) ou à une erreur sur le fichier (ferror())
    Si on utilises feof() pour détecter la fin de fichier, on fera une lecture de trop...

    Citation Envoyé par baccali Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ( fread(...) )
    {
     fprintf(...);
    }
    Là c'est bon. Puisque fread() renvoie le nombre d'éléments lus, alors détecter si ce nombre est à 0 permet de savoir si on est arrivé en fin de fichier...
    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]

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    A l'I.U.T. on nous apprend à faire la lecture, la vérification et le traitement seulement à la fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //lecture
    while(feof(file) != 0) //ici on vérifie juste qu'on est pas arrivé en fin de fichier, mais on pourrait vérifier d'autres choses
    EDIT : while(feof(file) == 0) 
    {
           //traitement
           //lecture
    }
    Ceci pourrait t'éviter des erreurs futures en séparant bien les opérations de lectures des opérations de vérifications (et là tu pourra utiliser feof)

  9. #9
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    NON !!!
    feof() ou ferror() ne servent pas à détecter la fin du fichier. Elles servent, une fois que la fonction de lecture ne lit plus rien, à détecter si la fin de lecture est due à une fin de fichier (feof()) ou à une erreur sur le fichier (ferror())
    As tu bien lu le code que j'ai mis en entier?
    Citation Envoyé par Sve@r Voir le message
    Si on utilises feof() pour détecter la fin de fichier, on fera une lecture de trop...
    feof() ne touche pas de "lecture" je sais pas où tu as vu çà! Cette fonction vérifie la structure FILE pour voir si le marqueur fin de fichier est activé ou non! Pareil pour ferror() avec le marqueur error. Elle touche pas au pointeur du fichier.


    Citation Envoyé par Sve@r Voir le message
    Là c'est bon. Puisque fread() renvoie le nombre d'éléments lus, alors détecter si ce nombre est à 0 permet de savoir si on est arrivé en fin de fichier...
    Et si ce nombre est à 0 parce qu'il y'a eut une erreur?

Discussions similaires

  1. Mettre "eof " pour delimiter un fichier binaire
    Par eyeofthetiger dans le forum Débuter
    Réponses: 4
    Dernier message: 03/06/2008, 00h27
  2. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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