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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top