c++ - tube - tu me pixeleas letra
Lectura byte byte byte byte binario (5)
¿Por qué utiliza la extracción con formato, en lugar de .read()
?
Estaba intentando leer un byte a byte de un archivo binario usando un ifstream. He usado métodos istream como get () antes para leer fragmentos enteros de un archivo binario a la vez sin ningún problema. Pero mi tarea actual se presta para ir byte a byte y confiar en el almacenamiento en búfer en el sistema io para hacerlo eficiente. El problema es que parecía llegar al final del archivo varios bytes antes de lo que debería. Así que escribí el siguiente programa de prueba:
#include <iostream>
#include <fstream>
int main() {
typedef unsigned char uint8;
std::ifstream source("test.dat", std::ios_base::binary);
while (source) {
std::ios::pos_type before = source.tellg();
uint8 x;
source >> x;
std::ios::pos_type after = source.tellg();
std::cout << before << '' '' << static_cast<int>(x) << '' ''
<< after << std::endl;
}
return 0;
}
Esto vuelca el contenido de test.dat, un byte por línea, que muestra la posición del archivo antes y después.
Por supuesto, si mi archivo tiene la secuencia de dos bytes 0x0D-0x0A (que corresponde al retorno de carro y al avance de línea), esos bytes se omiten.
- He abierto la secuencia en modo binario. ¿No debería eso evitar que interprete los separadores de línea?
- ¿Los operadores de extracción utilizan siempre el modo de texto?
- ¿Cuál es la forma correcta de leer byte a byte desde un istream binario?
MSVC ++ 2008 en Windows.
Como han mencionado otros, debes usar read() . Pero, si debe usar extracción formateada, considere std::noskipws
.
Los >> extractores son para entrada formateada; se saltan los espacios en blanco (por defecto). Para una entrada sin formato de un solo carácter, puede usar istream::get()
(devuelve un int
, EOF si la lectura falla, o un valor en el rango [0, UCHAR_MAX]) o istream::get(char&)
(pone el el carácter leído en el argumento, devuelve algo que se convierte en bool
, verdadero si la lectura es exitosa y falso si falla.
hay una función miembro de read() en la que puede especificar el número de bytes.
source.get()
le dará un solo byte. Es una función de entrada sin formato. operador >> es una función de entrada formateada que puede implicar omitir caracteres de espacios en blanco.