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 :

fread(void*, int, int, FILE*)


Sujet :

C++

  1. #1
    Membre confirm� Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par d�faut fread(void*, int, int, FILE*)
    bonjour, j'ai un doute mais je ne suis pas sur:

    admettons que j'ai la structure suivante:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    tytpedef struct test
    {
       int a, b;
       float c;
       char d;
    } test;
    je veux r�cup�rer cette structure contenue dans un fichier
    dois je faire:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    test *t;
    fread(t, 1, sizeof(test), f);
     
    //ou bien
    test *t = new test;
    fread(t, 1, sizeof(test), f);
    ?

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    101
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 101
    Par d�faut
    moi, je dirais :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    test t;
    fread(&t, 1, sizeof(test), f);
    mais je suis pas sur

  3. #3
    Membre confirm� Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par d�faut
    Citation Envoy� par le manuel
    size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);
    La fonction fread lit nmemb �l�ments de donn�es, chacun d'eux repr�sentant size octets de long, depuis le flux point� par stream, et les stocke � l'emplacement point� par ptr.
    a supposer qu'il faut que ptr doit etre allou�

  4. #4
    Membre �clair� Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par d�faut
    en tout cas pas �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    test *t;
    fread(t, 1, sizeof(test), f);
    puisque comme tu l'as dit, t doit �tre allou�!
    La tu vas �crire n'importe ou.

    Cette solution marche:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    test *t = new test;
    fread(t, 1, sizeof(test), f);
    Mais la solution de delfare aussi, et elle est (tres peu) plus rapide

  5. #5
    Membre �m�rite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    F�vrier 2004
    Messages
    644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant ERP

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 644
    Par d�faut
    Je prendrais plut�t la solution de "delfare", du moins dans un premier exemple, car si keil a d�j� du mal avec de simple pointeur, il ne faut pas demander quand cela sera plus compliqu�.

    PS : Jusqu'� pr�sent, fread n'alloue pas la m�moire n�cessaire pour stocker son r�sultat de lecture dans un pointeur sans connaitre son type.

    Il pourrait tr�s bien le faire, mais il pourrait alors cr�er un segfault.

  6. #6
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Les fonctions de lecture brute le font dans une zone m�moire qui doit �tre valide -- elles n'allouent rien du tout.

    Attention aux d�tails de padding/alignement et cie. Dans la pratique, on n'utilise pas ces fonctions sur des structures car la surprise est vite arriv�e.

    EDIT: texte tap� pas r�veill�
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  7. #7
    Membre �m�rite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    F�vrier 2004
    Messages
    644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant ERP

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 644
    Par d�faut
    merci d'avoir confirm� la non-allocation de m�moire par fread.

  8. #8
    Membre confirm� Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par d�faut
    franchement, j'ai meme pas test avec un pointeur vers une zone non allou�e, le manuel l'a implicitement exig�.
    mais ca marche tres bien, normal quoi, avec un pointeur vers une zone allou�e.

    luc ermitte a dit:
    Attention aux d�tails de padding/alignement et cie. Dans la pratique, on n'utilise pas ces fonctions sur des structures car la surprise est vite arriv�e.

    et tu fera comment alors pour sauvegarder (ou charger) des elements vers (ou d')un fichier?

    bref, ca marche tres bien

  9. #9
    Membre �m�rite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    F�vrier 2004
    Messages
    644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant ERP

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 644
    Par d�faut
    en C++, avec les flux de la STL, std::ofstream et std::ifstream.

    FAQ sur les fichiers en C++

  10. #10
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Citation Envoy� par keil
    et tu fera comment alors pour sauvegarder (ou charger) des elements vers (ou d')un fichier?
    Cela d�pend. Si sauver en condens� non textuel est une n�cessit�, alors cela sera champs par champs, et pour chaque champs, octet par octet afin de suivre un boutisme ou l'autre.

    Autrement, Il y a des m�thodes variables en fonction du niveau d'analyse � op�rer sur les fichiers. Juste pour sauver des donn�es, boost.serialize me plait bien. Mais on peut aussi tout se faire � la main avec les flux standard du C++. Ou sortir des vrai analyseurs lexicaux et s�mantiques si des traitements plus complexes doivent �tre op�r�s -- genre une v�rification de consistance, d'erreurs, ...

    bref, ca marche tres bien
    Aujourd'hui. Change d'options de compilations, de compilateur, de plateforme/architecture, ... je doute que cela marche encore. Enfin. Avec un m�me logiciel final pour une plateforme donn�e, tu pourras lire/�crire tes fichiers. Par contre, une sauvegarde faite aujourd'hui pour ton PC ne marchera peut-�tre plus sur ton PC de dans 5 ans apr�s recompilation, et probablement pas sous Solaris aujourd'hui m�me.

    (Oui, c'est du pinaillage pour un codeur isol�.)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  11. #11
    Membre confirm� Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par d�faut
    je comprend ce que vous voulez dire, mais ca compilera toujours, meme si vous etes pas d'accord.

    et de toute facon le resultat sera toujours valide du fait que les chargements sont effectu�s par la m�me machine qui a proc�der aux sauvegardes.

    mais je comprends que ma m�thode n'est pas 'codiquement' correcte

  12. #12
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Je n'ai jamais dis que cela ne compilerait pas. Juste qu'il faut que tu t'attendes � avoir un jour des probl�mes car les fichiers d'une version peuvent facilement devenir incompatibles avec une autre.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 7
    Dernier message: 14/03/2014, 21h50
  2. [caml light] ( int -> int ) -> int
    Par ylarvor dans le forum Caml
    R�ponses: 5
    Dernier message: 26/11/2009, 19h35
  3. Utilisation de public void add(int field, int amount)
    Par NFHnv dans le forum D�buter avec Java
    R�ponses: 21
    Dernier message: 05/03/2009, 15h11
  4. int getc (FILE * stream)
    Par raphadw dans le forum Biblioth�que standard
    R�ponses: 6
    Dernier message: 31/01/2008, 16h20
  5. Convertir un void* en int ...?
    Par alex6891 dans le forum C++
    R�ponses: 15
    Dernier message: 15/11/2005, 22h43

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