c++ - good - ¿Qué hace realmente ifstream:: rdbuf()?
ifstream get (2)
Tengo el siguiente código y funciona bastante bien (aparte del hecho de que es bastante lento, pero eso no me importa mucho). No parece intuitivo que esto escriba todo el contenido del archivo en el 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;
}
¿Alguna idea?
Sí, está especificado en el estándar y en realidad es bastante simple. rdbuf()
simplemente devuelve un puntero al objeto basic_streambuf
subyacente para el objeto de [io]stream
dado.
basic_ostream<...>
tiene una sobrecarga para el operator<<
para un puntero a basic_streambuf<...>
que escribe el contenido de basic_streambuf<...>
.
iostream
clases de iostream
son simplemente envoltorios alrededor de buffers de E / S. El propio iostream
no hace mucho ... principalmente, proporciona operator>>
formateo a operator>>
operadores. El búfer es proporcionado por un objeto derivado de basic_streambuf
, que puede obtener y establecer utilizando rdbuf()
.
basic_streambuf
es una base abstracta con una serie de funciones virtuales que se anulan para proporcionar una interfaz uniforme para leer / escribir archivos, cadenas, etc. La función basic_ostream<…>::operator<<( basic_streambuf<…> )
se define para mantener leyendo el búfer hasta que se agote la fuente de datos subyacente.
iostream
embargo, iostream
es un desastre terrible.