Leggere e scrivere un file std :: vector in un file correttamente

Questo è il punto. Come scrivere e leggere file binari con std :: vector al loro interno?

Stavo pensando qualcosa come:

//============ WRITING A VECTOR INTO A FILE ================ const int DIM = 6; int array[DIM] = {1,2,3,4,5,6}; std::vector myVector(array, array + DIM); ofstream FILE(Path, ios::out | ofstream::binary); FILE.write(reinterpret_cast(&myVector), sizeof(vector) * 6); //=========================================================== 

Ma non so come leggere questo vettore. Perché pensavo che quanto segue fosse corretto ma non lo è:

 ifstream FILE(Path, ios::in | ifstream::binary); FILE.read(reinterpret_cast(&myVector), sizeof(vector) * 6); 

Quindi, come eseguire l’operazione?

Prova a utilizzare ostream_iterator / ostreambuf_iterator , istream_iterator / istreambuf_iterator e i metodi di copy STL:

 #include  #include  #include  #include  #include  // looks like we need this too (edit by π) std::string path("/some/path/here"); const int DIM = 6; int array[DIM] = {1,2,3,4,5,6}; std::vector myVector(array, array + DIM); std::vector newVector; std::ofstream FILE(path, std::ios::out | std::ofstream::binary); std::copy(myVector.begin(), myVector.end(), std::ostreambuf_iterator(FILE)); std::ifstream INFILE(path, std::ios::in | std::ifstream::binary); std::istreambuf_iterator iter(INFILE); std::copy(iter.begin(), iter.end(), std::back_inserter(newVector)); 

Usa boost::serialization .

Se non vuoi usare boost – scrivi dimensioni e vector .

 size_t sz = myVector.size(); FILE.write(reinterpret_cast(&sz), sizeof(sz)); FILE.write(reinterpret_cast(&myVector[0]), sz * sizeof(myVector[0])); 

Puoi usare

 #include  

per serializzare il tuo vettore. Leggi un tutorial qui: http://www.boost.org/libs/serialization/doc/tutorial.html#stl `

Prima di leggere il vector , dovresti ridimensionarlo: yourVector.size(numberOfElementsYouRead) .

Inoltre, sizeof(vector) è solo la dimensione dell’implementazione interna dell’object vector ; la dimensione dell’elemento vettoriale è sizeof(std::vector::value_type) .

Quindi leggi in questo modo:

 file.read(reinterpret_cast(&myVector[0]), sizeof(vector::element_type) * element_count); 

Ho usato il fatto che il metodo data () restituisce un indirizzo che puoi usare per leggere E per scrivere.

// Supponi che outf è un filepointer scrivibile (binario). // scrivi myVector.size () su file, quindi

 fwrite(myVector.data(), sizeof(decltype(myVector)::value_type), myVector.size(), outf); 

leggere:

// legge MyVector.size () dal file come nv, inpf viene letto filepointer

 MyVector.resize(nv); fread(MyVector.data(), sizeof(decltype(MyVector)::value_type), nv, inpf); 

aggrappato a vecchi modi nel file io, ma per favore ignoralo (anche se potrebbe irritarti :)).

Un punto debole è che l’endianità non è supportata in questo modo.