C ++, scrittura vettore per ofstream salta gli spazi bianchi
Domanda
Nonostante i miei sforzi sinceri, io non riesco a trovare il bug qui. Sto scrivendo un vettore a un ofstream. Il vettore contiene dati binari. Tuttavia, per qualche motivo, quando si suppone che uno spazio bianco (0x10, 0x11, 0x12, 0x13, 0x20) da scrivere, è saltato.
Ho provato ad utilizzare iteratori, e un ofstream diretta :: write ().
Ecco il codice che sto utilizzando. Ho commentato alcuni degli altri metodi che ho provato.
void
write_file(const std::string& file,
std::vector<uint8_t>& v)
{
std::ofstream out(file, std::ios::binary | std::ios::ate);
if (!out.is_open())
throw file_error(file, "unable to open");
out.unsetf(std::ios::skipws);
/* ostreambuf_iterator ...
std::ostreambuf_iterator<char> out_i(out);
std::copy(v.begin(), v.end(), out_i);
*/
/* ostream_iterator ...
std::copy(v.begin(), v.end(), std::ostream_iterator<char>(out, ""));
*/
out.write((const char*) &v[0], v.size());
}
EDIT:. E il codice per leggere indietro
void
read_file(const std::string& file,
std::vector<uint8_t>& v)
{
std::ifstream in(file);
v.clear();
if (!in.is_open())
throw file_error(file, "unable to open");
in.unsetf(std::ios::skipws);
std::copy(std::istream_iterator<char>(in), std::istream_iterator<char>(),
std::back_inserter(v));
}
Ecco un esempio di input:
30 0 0 0 a 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2
E questo è l'output che sto ottenendo quando l'ho letto di nuovo:
30 0 0 0 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2
Come si può vedere, 0x0A viene ommited, apparentemente perché di spazi bianchi.
Qualche suggerimento sarebbe molto apprezzato.
Soluzione 2
Invece di letame in giro con la scrittura vector <> s direttamente, boost::serialization
è un modo più efficace, utilizzando boost::archive::binary_oarchive
.
Altri suggerimenti
Hai dimenticato di aprire il file in modalità binaria nella funzione read_file.
penso 'a' viene considerato come nuova linea. Ho ancora pensare come ottenere intorno a questo.
L'istream_iterator dal disegno salta gli spazi bianchi. Provare a sostituire il vostro std :: copia con questo:
std::copy(
std::istreambuf_iterator<char>(in),
std::istreambuf_iterator<char>(),
std::back_inserter(v));
L'istreambuf_iterator va direttamente all'oggetto streambuf, che eviterà gli spazi che si sta vedendo elaborazione.