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?

¿Fue útil?

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.

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