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 actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    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);
    ?
    Colère et Haine mènent à la Puissance

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 101
    Points : 75
    Points
    75
    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 actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    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é
    Colère et Haine mènent à la Puissance

  4. #4
    Membre actif 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
    Points : 203
    Points
    203
    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 éclairé
    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
    Points : 785
    Points
    785
    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.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    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 éclairé
    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
    Points : 785
    Points
    785
    Par défaut
    merci d'avoir confirmé la non-allocation de mémoire par fread.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  8. #8
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    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
    Colère et Haine mènent à la Puissance

  9. #9
    Membre éclairé
    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
    Points : 785
    Points
    785
    Par défaut
    en C++, avec les flux de la STL, std::ofstream et std::ifstream.

    FAQ sur les fichiers en C++
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    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 actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    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
    Colère et Haine mènent à la Puissance

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    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