Una gran parte de la ventaja de la capa istream es proporcionar formato básico y análisis para tipos simples ro y de una secuencia. Para los fines que describe, nada de esto es realmente importante y solo le interesa el archivo como una secuencia de bytes.
Para estos fines, es mejor utilizar la interfaz basic_streambuf proporcionada por un archivo bbu. El comportamiento 'skip whitespace' es parte de la funcionalidad de la interfaz istream que simplemente no necesita.
filebuf subyace un ifstream, pero es perfectamente válido para usarlo directamente.
std::filebuf myfile;
myfile.open("myfile.dat", std::ios_base::in | std::ios_base::binary);
// gets next char, then moves 'get' pointer to next char in the file
int ch = myfile.sbumpc();
// get (up to) the next n chars from the stream
std::streamsize getcount = myfile.sgetn(char_array, n);
también echar un vistazo a las funciones snextc (mueve el 'conseguir' puntero hacia adelante y luego devuelve el carbón actual), sgetc (obtiene el carbón actual, pero no se mueve el puntero 'get') y sungetc (respalda el puntero 'get' en una posición si es posible).
Cuando no necesita ninguno de los operadores de inserción y extracción proporcionados por una clase istream y solo necesita una interfaz de bytes básica, a menudo la interfaz streambuf (filebuf, stringbuf) es más apropiada que istream (ifstream, istringstream)
Usar _good() _ es mejor que _eof() _. Si se requiere la lectura de char por char _if (mi_archivo >> ch) _ es la correcta, y la comprobación de eof no es correcta. Consulte: http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.5 – legends2k