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 :

Fichier binaire, écriture/lecteur de std::vector


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Fichier binaire, écriture/lecteur de std::vector
    Bonjour à toutes et à tous et bonne année !

    J'ai une petite question de novice sur la lecture/écriture sur fichier binaire de vecteurs à deux dimension (voire même une seule en fait). J'ai fait un chtit code tout con qui affiche un vecteur, l'écrit dans un fichier en binaire, relit le fichier, et re-affiche le vecteur ainsi lu. En espérant obtenir la même chose logiquement
    Mais ça ne marche point ...


    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <iomanip>
    #include<iostream>
    #include<fstream>
    #include<math.h>
    #include <vector>
    using namespace std;
    int main(int argc, char *argv[])
    {
      int n = 3, m = 5;
      std::vector<std::vector<double> > t1(n, std::vector<double>(m)),t2(n, std::vector<double>(m));
      double cpt = 0.;
      for (int i = 0; i < n; i++)
          for (int j = 0 ; j < m ; j++, cpt++)
      t1[i][j] = cpt;
    //écriture sur disque de t1
      std::ofstream fin("truc", ios::binary);
      fin.write((char *)&t1[0][0], m*n*sizeof(double));
      fin.close();
    //lecture sur disque dans t2
      std::ifstream fout ("truc", ios::binary);
      fout.read((char *)&t2[0][0], n*m*sizeof(double));
      fout.close();
    //comparaison
      for (int i = 0; i < n; i++)
        for(int j = 0 ; j< m ; j++)
          printf("t1[%d][%d]=%g, t2[%d][%d]=%g\n", i,j, t1[i][j], i,j, t2[i][j]);
      return 0;
    }
    Cha me donne ça :

    t1[0][0]=0, t2[0][0]=0
    t1[0][1]=1, t2[0][1]=1
    t1[0][2]=2, t2[0][2]=2
    t1[0][3]=3, t2[0][3]=3
    t1[0][4]=4, t2[0][4]=4
    t1[1][0]=5, t2[1][0]=5
    t1[1][1]=6, t2[1][1]=6
    t1[1][2]=7, t2[1][2]=7
    t1[1][3]=8, t2[1][3]=8
    t1[1][4]=9, t2[1][4]=9
    t1[2][0]=10, t2[2][0]=10
    t1[2][1]=11, t2[2][1]=11
    t1[2][2]=12, t2[2][2]=12
    t1[2][3]=13, t2[2][3]=0
    t1[2][4]=14, t2[2][4]=0


    D'où ma déception : certains nombres sont partis à l'as. j'ai tenté en splittant les deux dimensions du vecteur, c'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    for (int i = 0; i < n ; i++)
        fin.write((char *)&t1[i][0], m*sizeof(double));
    ...
      for (int i = 0; i < n ; i++)
        fout.read((char *)&t2[i][0], m*sizeof(double));
    Et ça semble fonctionner (ouf). Que la première version ne fonctionne pas, ne m'étonne et ne m'émeut qu'à moitié. Toutefois, je pensais que si elle ne marcherait pas, cela serait du au fait que les sous-vecteurs d'un vecteur ne sont pas forcément contigus en mémoire (??), mais alors pourquoi mon petit code naif retrouve toutes les bonnes valeurs sauf les deux dernières...
    Plus précisément, pourquoi t1[2][0], t1[2][1] et t1[2][2] sont ok, mais pas les deux suivantes, appartenant pourtant au même vecteur (et donc de valeurs contiguës en mémoire).

    Bref, si quelqu'un a une explication, je lui en serai très reconnaissant

    Merci d'avance, et bonne fin de journée !

    PS : un fichier écrit en binaire de données (par ex. des double), prend bien moins de place disque qu'en ascii ? ou juste un peu moins ? ou kiff-kiff bourriquot ?

  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
    Par défaut
    Un nombre 32 bits, écrit en décimal, peut faire de 1 à 10 caractères (plus séparateur(s)). Écrit en binaire, il fera toujours quatre octets (et n'aura généralement pas de séparateur).

    Pour un nombre à virgule flottante, le nombre de chiffres peut être beaucoup plus grand selon la précision: Un nombre double-précision (64 bits, donc huit octets) correspond à environ 16 chiffres significatifs (+ virgule, exposant...).
    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
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Citation Envoyé par Thosbk Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fin.write((char *)&t1[0][0], m*n*sizeof(double));
    fout.read((char *)&t2[0][0], n*m*sizeof(double));
    Rien ne garanti que tous tes vecteurs seront contigu en mémoire.
    Ça marche ici, mais ça peut très bien ne plus marcher demain.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    for (int i = 0; i < n ; i++)
        fin.write((char *)&t1[i][0], m*sizeof(double));
    ...
      for (int i = 0; i < n ; i++)
        fout.read((char *)&t2[i][0], m*sizeof(double));
    C'est la méthode à adopter.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Un nombre 32 bits, écrit en décimal, peut faire de 1 à 10 caractères (plus séparateur(s)). Écrit en binaire, il fera toujours quatre octets (et n'aura généralement pas de séparateur).

    Pour un nombre à virgule flottante, le nombre de chiffres peut être beaucoup plus grand selon la précision: Un nombre double-précision (64 bits, donc huit octets) correspond à environ 16 chiffres significatifs (+ virgule, exposant...).
    Oki merci pour la précision !

    Citation Envoyé par Iradrille Voir le message
    Hello,
    Rien ne garanti que tous tes vecteurs seront contigu en mémoire.
    Ça marche ici, mais ça peut très bien ne plus marcher demain.
    Merci !
    Bon ici ça ne marche justement pas, ou plutôt, à moitié ...

    Citation Envoyé par Iradrille Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    for (int i = 0; i < n ; i++)
        fin.write((char *)&t1[i][0], m*sizeof(double));
    ...
      for (int i = 0; i < n ; i++)
        fout.read((char *)&t2[i][0], m*sizeof(double));
    C'est la méthode à adopter.
    Ok parfait, c'est ce que je voulais savoir, merci !

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

Discussions similaires

  1. Problème d'écriture vers fichier binaire
    Par Mr Light dans le forum C++
    Réponses: 6
    Dernier message: 27/02/2008, 21h25
  2. Écriture fichier binaire
    Par Marneus dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/09/2007, 23h59
  3. [VS2005]lecture/écriture dans fichier binaire
    Par shadowmoon dans le forum Windows Forms
    Réponses: 10
    Dernier message: 25/09/2007, 17h30
  4. écriture fichier binaire
    Par alex'l dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 31/01/2007, 15h43
  5. Réponses: 7
    Dernier message: 01/09/2006, 14h19

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