Lo que hace ifstream :: rdbuf () realmente?
Pregunta
Tengo el siguiente código y funciona bastante bien (aparte del hecho de que es bastante lento, pero no me importa mucho acerca de eso). No parece intuitivo que esto podría escribir todo el contenido de la infile al archivo de salida.
// Returns 1 if failed and 0 if successful
int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
ifstream infile(inFilename.c_str(), ios::binary);
ofstream outfile(outFilename.c_str(), ios::binary);
if( infile.is_open() && outfile.is_open() && infile.good() && outfile.good() )
{
outfile << infile.rdbuf();
outfile.close();
infile.close();
}
else
return 1;
return 0;
}
Cualquier idea?
Solución
Sí, se especifica en la norma y en realidad es bastante simple. rdbuf()
simplemente devuelve un puntero al objeto basic_streambuf
subyacente para el objeto [io]stream
dado.
basic_ostream<...>
tiene una sobrecarga de operator<<
para un puntero a basic_streambuf<...>
que escribe el contenido de la basic_streambuf<...>
.
Otros consejos
clases iostream
son sólo las envolturas alrededor de buffers de E / S. El iostream
si mismo no hace mucho ... sobre todo, que proporciona a los operadores la operator>>
formateo. El tampón es proporcionado por un objeto derivado de basic_streambuf
, que se puede obtener y establecer usando rdbuf()
.
basic_streambuf
es una base abstracto con un número de funciones virtuales que se anula para proporcionar una interfaz uniforme para la lectura / escritura de archivos, cuerdas, etc. El basic_ostream<…>::operator<<( basic_streambuf<…> )
función se define para mantener la lectura a través de la memoria intermedia hasta que la fuente de datos subyacente se ha agotado .
iostream
es un lío terrible, sin embargo.