2017-03-09 2 views
0

Je travaille sur un projet impliquant des fichiers binaires. J'ai donc commencé à faire des recherches sur les fichiers binaires mais je suis encore confus sur la façon d'écrire et de remplir un vecteur à partir de ce fichier binaire que j'ai écrit auparavantÉcrire et lire un fichier binaire pour remplir un vecteur - C++

Voici le code: pour écrire.

void binario(){ 
ofstream fout("./Binario/Data.AFe", ios::out | ios::binary); 
vector<int> enteros; 
enteros.push_back(1); 
enteros.push_back(2); 
enteros.push_back(3); 
enteros.push_back(4); 
enteros.push_back(5); 
//fout.open() 
//if (fout.is_open()) { 
    std::cout << "Entre al if" << '\n'; 
    //while (!fout.eof()) { 
     std::cout << "Entre al while" << '\n'; 
     std::cout << "Enteros size: "<< enteros.size() << '\n'; 
     int size1 = enteros.size(); 
     for (int i = 0; i < enteros.size(); i++) { 
      std::cout << "for " << i << '\n'; 
      fout.write((char*)&size1, 4); 
      fout.write((char*)&enteros[i], size1 * sizeof(enteros)); 
      //cout<< fout.get(entero[i])<<endl; 
     } 
     //fout.close(); 
    //} 
    fout.close(); 
    cout<<"copiado con exito"<<endl; 
//} 
} 

Code est ici pour la lecture:

oid leerBinario(){ 
vector<int> list2; 

ifstream is("./Binario/Data.AFe", ios::binary); 
    int size2; 
    is.read((char*)&size2, 4); 
    list2.resize(size2); 


    is.read((char*)&list2[0], size2 * sizeof(list2)); 

    std::cout << "Size del vector: " << list2.size() <<endl; 
    for (int i = 0; i < list2.size(); i++) { 
     std::cout << i << ". " << list2[i] << '\n'; 
    } 
    std::cout << "Antes de cerrar" << '\n'; 
    is.close(); 
} 

Je ne sais pas si j'écris correctement le fichier, cela est juste un test, donc je ne suis pas gâcher mon fichier principal, Au lieu d'écrire des nombres, je dois sauvegarder les objets qui sont stockés dans un vecteur et les charger chaque fois que l'utilisateur exécute le programme.

+0

Relire le fichier que vous avez écrit et obtenir les mêmes valeurs que vous avez écrites serait un bon test pour savoir si vous écrivez correctement dans le fichier. –

+2

Je ne comprends pas pourquoi vous écrivez 'enteros.size()' pour chaque élément vectoriel au lieu de simplement l'écrire une seule fois. Et quand vous écrivez 'enteros [i]' vous ne voulez certainement pas 'enteros.size() * sizeof (enteros)' parce que c'est 5 fois les octets dans le vecteur entier - vous voulez probablement 'sizeof (enteros [i]) ' –

Répondre

0

Non, vous êtes un peu confus. Vous écrivez la taille à chaque itération, et vous faites quelque chose de complètement indéfini lorsque vous essayez d'écrire la valeur. Vous pouvez réellement le faire sans la boucle, lorsque vous utilisez un vecteur.

fout.write(&size1, sizeof(size1)); 
fout.write(enteros.data(), size1 * sizeof(int)); 

Et lire dans:

is.read(&list2[0], size2 * sizeof(int)); 

Pour être plus portable que vous pouvez utiliser les types de données qui ne changeront pas (par exemple lorsque vous passez de la compilation 32 bits à 64 bits) . Dans ce cas, utilisez des éléments de <cctype> - par exemple. int32_t pour les données de taille et de valeur.

+0

Cela m'a vraiment aidé, merci. J'ai une autre question que je devais lancer à (char *) pourquoi ai-je besoin de faire cela, si je l'enlève il ne compile pas. De même, pour écrire et lire des objets, ce serait la même chose, en remplaçant simplement fout.write ((char *) & size1, sizeof (size1)); fout.write ((char *) OBJVECTOR.data(), taille1 * sizeof (OBJECTNAME)); Merci pour votre aide! – AvengedFenix