Pregunta

A pesar de mis esfuerzos más sinceros, parece que no puedo localizar el error aquí. Estoy escribiendo un vector a un Ofstream. El vector contiene datos binarios. Sin embargo, por alguna razón, cuando se supone que se escribe un carácter de espacio en blanco (0x10, 0x11, 0x12, 0x13, 0x20), se omite.

He intentado usar iteradores y un directo de stream :: write ().

Aquí está el código que estoy usando. He comentado algunos de los otros métodos que he probado.

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

Editar: y el código para leerlo.

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

Aquí hay una entrada de ejemplo:

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

Y esta es la salida que obtengo cuando la leo:

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

Como puede ver, 0x0a está siendo omitido, aparentemente porque es un espacio en blanco.

Cualquier sugerencia sería muy apreciada.

¿Fue útil?

Solución 2

En lugar de meterse con el vector de escritura <> s directamente, boost::serialization es una forma más efectiva, usando boost::archive::binary_oarchive.

Otros consejos

Olvidó abrir el archivo en modo binario en la función Read_file.

Creo que 'A' se trata como una nueva línea. Todavía tengo que pensar cómo evitar esto.

El istream_iterator por diseño omita el espacio en blanco. Intente reemplazar su STD :: Copiar con esto:

std::copy(
    std::istreambuf_iterator<char>(in),
    std::istreambuf_iterator<char>(),
    std::back_inserter(v));

El istreamBuf_iterator va directamente al objeto StreamBuf, que evitará el procesamiento de espacios en blanco que está viendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top