2017-03-09 21 views
0

私はバイナリファイルを含むプロジェクトに取り組んでいます。 私はバイナリファイルについて調査を始めましたが、前に書いたバイナリファイルからベクトルを書き込んで書き込む方法についてはまだ混乱していますバイナリファイルを書き込んでベクトルを埋め込む - C++

ここにコードは書いてあります。

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; 
//} 
} 

ここで読書のためのコードです:

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(); 
} 

私は、ファイルに正しく書いている場合、私は知らない私はめちゃくちゃ私のメインのファイルがないので、これは単なるテストです、数値を書く代わりに、私はベクトルに格納されたオブジェクトを保存し、ユーザーがプログラムを実行するたびに読み込む必要があります。

+0

あなたが書き込んだファイルを読み返し、あなたが書き込んだのと同じ値を取得することは、ファイルに正しく書き込んでいるかどうかの良いテストになります。 –

+2

私はなぜ単一文を書くのではなく、単一のベクトル要素ごとに 'enteros.size()'を書くのか分かりません。そして、 'enteros [i]'と書いたときには、 'enteros.size()* sizeof(enteros)'がベクトル全体のバイトの5倍であるので、間違いなく 'sizeof(enteros [i] ) ' –

答えて

0

いいえ、あなたはちょっと混乱しています。すべての反復でサイズを書いていますが、値を書き込もうとすると完全に定義されていないものを実行しています。実際には、ベクトルを使用しているときにループなしでこれを行うことができます。

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

として読み:あなたは(あなたが64ビットに32ビットのコンパイルから切り替えたときなど)に変更はありませんデータ型を使用したい場合があり、よりポータブルにするために

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

。その場合は<cctype>のものを使用してください。サイズデータと値データの両方についてはint32_tです。

+0

これは本当に感謝してくれました。私はキャストする必要が別の質問がある(チャール*)なぜ私はこれを行う必要があります、私はそれを取り出す場合はコンパイルされません。 また、オブジェクトを書き込んだり読み込んだりすると同じことになります。ちょうど置き換えられます。 fout.write((char *)&size1、sizeof(size1)); fout.write((char *)OBJVECTOR.data()、size1 * sizeof(OBJECTNAME)); ご協力いただきありがとうございます! – AvengedFenix

関連する問題