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 avec fread.Taille limitée?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut Lecture de fichier avec fread.Taille limitée?
    Bonjour, je travaille actuellement sur un projet qui transforme une image tga en image monochrome avec un niveau de compression assez spécial.

    J'arrive à enregistrer correctement mes structures tels que le fichier se compose de cette manière

    Header
    - char Mot Magique *9
    - int Largeur et Hauteur (donc 2*int)
    - int Nombre de carré *1
    Corps 1
    - MCFcarresave_st Structure carré (autant de fois qu'il y a de carrés)
    Corps 2
    - unsigned char Pixels restant (autant de fois qu'il le faut)

    Lorsqu'il enregistre, il enregistre tout dans son intégralité (j'ai vérifié par 3 4 manières différentes pour être vraiment sû). Mais lorsqu'il le lit, il s'arrête à un certain nombre de carrés (du genre 580 pour 1200 carrés...), alors que la fin réel du fichier n'est pas atteinte (malgré l'instruction feof).
    Si je retire feof, il me remplit tout le reste avec des valeurs nulles, ce qui ne m'arrange pas...

    Si je supprime les carrés en écriture et lecture, il me fait le même coup lors de la lecture des pixels...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //...
    //nb= nombre de carrés
     
    MCFcarresave_st buffer;
    for(int i=0; i<nb; i++)
    {
     fread(&buffer, sizeof(buffer), 1, fichier);
     
     if(feof(fichier)) { printf("Fichier corrompu.."); return -1;
     
     //... (traitement de la donnée)
    }
    Le fichier fait plus de 100ko, ce qui normalement ne devrait pas poser problème...
    j'utilise CodeBlock.

    Merci pour votre aide...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut oui mais...
    merci pour ta réponse, mais...
    le fait est surtout que je ne peux pas lire plus loin qu'un certain nombre de données, alors que le fichier est beaucoup plus long...

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    c'est dû à ta mauvaise utilisation de feof...

    Et aussi on ne sait pas si tu as alloué la bonne taille pour le buffer..

    Mais en fait fread te retournes le nombre de caractères lus.. Donc tu n'as pas besoind de ce test..

    Tu fais une boucle de 0 à (n-1)..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par souviron34
    Mais en fait fread te retournes le nombre de caractères lus.. Donc tu n'as pas besoind de ce test..
    perdu !
    Citation Envoyé par man
    RETURN VALUE
    fread() and fwrite() return the number of items successfully read or
    written (i.e., not the number of characters). If an error occurs, or
    the end-of-file is reached, the return value is a short item count (or
    zero).
    je me suis fait avoir aussi y'as quelques jours
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et ??

    Si tu demandes à lire des caractères, tu as bien le nombre de caractères.. C'est uniquement si tu demandes à lire autre chose (des floats, des structures, etc..) que le nombre retourné est un nombre de "blocs". Mais si la taille du bloc que tu veux lire est 1, c'est équivalent...

    Sauf quand ça échoue.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 09/03/2009, 09h54
  2. quelques soucis de lecture de fichiers avec fscanf
    Par monsieurab dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 05/11/2008, 14h28
  3. lecture de fichier avec comparaison
    Par idsec dans le forum Web
    Réponses: 1
    Dernier message: 25/04/2007, 17h25
  4. lecture de fichier avec ftplib
    Par yggdrazil dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 14/10/2006, 21h47
  5. [LG]Lecture de fichier avec une adresse internet
    Par forbin dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2005, 19h00

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