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 :

Problème sur fread


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 35
    Points
    35
    Par défaut Problème sur fread
    Bonjour,

    Voila des années que j'ai pas touché une ligne de code et là je dois debugger un truc dont je ne vois pas ou se situe le problème.

    J'ai un petite bout de programme qui lit un fichier (texte) et remplit un buffer. C'est tout bete, et pourtant ça ne marche pas. Ou du moins ça ne marche pas avec un nouveau fichier qu'on vient de me fournir, alors que jusque là il n'y avait pas de problèmes. Certes le fichier incriminé est plus gros que ceux traités d'habitude, mais il n'est pas non plus monstrueux (32ko).

    Le problème est que le fread que je fait me remplit bien le buffer, mais avec plus d'infos que lu dans mon fichier. Plus precisement, une partie de la fin du fichier se retrouve dupliqué plusieurs fois dans mon buffer. J'ai un buffer plus gros que le contenu de mon fichier!

    Voila le bout de code en question :

    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
     
    char	                *Buf;
    struct _stat	Buffer;
    FILE			*fp;
     
    /* Information sur le fichier */
    _stat( nom_fichier, &Buffer );
     
    /* Allocation pour hargement du fichier en mémoire */
    Buf = malloc( Buffer.st_size+1 );
     
    /* Ouverture du fichier */
    fp = fopen( nom_fichier, "r" );
     
    /* Lecture du fichier */
    fread( Buf, sizeof( char ), Buffer.st_size, fp );
     
    /* Fermeture du descripteur */
    fclose ( fp );
    Le fichier lu est en piece jointe.

    C'est certainement une erreur de débutant (ce que je suis redevenu), mais impossible de la trouver, je suis aujourd'hui trop débordé pour arriver à reflechir correctement aujourd'hui.

    Merci donc à ceux qui m'apporteront un coup de main (et puis bon reveillon à tout ceux qui liront ce post, on est pas que des betes non plus).
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Tu ouvres ton fichier avec un mode par défaut. Sous Windows (ou DOS), cela provoque par défaut un mode texte (il faut dire "rb" pour le mode binaire).
    Le mode texte provoque la conversion des CR-LF en caractère "\n", ce qui fait que si ton fichier en contient (je n'ai pas vérifié), la quantité de données placées dans ton buffer est effectivement inférieure à la taille du fichier.
    Avec ce que je vois, c'est la seule explication.

    Sinon, mais ça parait grotesque, serait-il possible que ton environnement d'exécution soit 16 bits ???

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    Merci pour ton intervention.

    Cependant, j'ai besoin d'ouvrir mon fichier en mode texte et non en binaire (malgrès son extension, c'est bien un fichier texte). Le fichier contient effectivement des CR-LF et mon buffer doit conserver les sauts de lignes (pour le traitement ulterieur).
    Et mon problème est l'inverse de ce que tu décris, à savoir que mon buffer est plus grand que mon fichier texte

    Quand à mon environnement d'execution, c'est du windows 32 voir 64 bits.

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Bizarre bizarre .... tu as essayé de regarder ce que retourne fread (le nombre de caractères lus) en lisant ton fichier ? et de comparer cette valeur à celle retournée par stat ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    Oui, j'ai fait le test. Le bout de code que j'ai presenté est épuré par rapport à ce qu'il etait au début.
    Je faisais le test suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if ( fread( Buf, sizeof( char ), Buffer.st_size, fp ) != (size_t)Buffer.st_size )
    {
    	if ( feof( fp ) && ferror( fp ) )
    	{
                     //Traitement erreur
    	}  
    }
    Qui n'a jamais généré d'erreur.
    Peut etre le fichier passé est-il foireux? Faut que je regarde.

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Moi j'insererais un traitement d'erreur directement apres le test fread != st_size, et avant :
    if ( feof( fp ) && ferror( fp ) )

    Il y a quand meme qqchose qui me tracace avec cette histoire : si tu dis que fread te retourne le bon nombre d'octets lus (sinon, d'apres toi, tu obtiendrais une erreur), et que ce nombre correspond a la taille du fichier + 1 octet, comment peux tu dire que le buffer est plus grand que le fichier ??
    ca peut paraitre bete, mais la je suis un peu fatigue, et j'avoue que je comprends pas.

  7. #7
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Comment fais-tu pour afficher le contenu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(stdout, "%s\n", Buf);
    va déborder si tu ne fais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buf[Buffer.st_size] = 0;

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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