Che cosa significa ifstream :: rdbuf () effettivamente fare?
Domanda
Ho il seguente codice e funziona abbastanza bene (a parte il fatto che è piuttosto lento, ma non mi interessa più di tanto). Non sembra intuitivo che questo avrebbe scritto l'intero contenuto del infile alla outfile.
// 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;
}
Tutta la comprensione?
Soluzione
Sì, è specificato nella norma ed è in realtà abbastanza semplice. rdbuf()
solo restituisce un puntatore all'oggetto basic_streambuf
sottostante per l'oggetto di [io]stream
.
basic_ostream<...>
ha un sovraccarico per operator<<
per un puntatore a basic_streambuf<...>
che scrive il contenuto del basic_streambuf<...>
.
Altri suggerimenti
classi iostream
sono solo wrapper attorno I / O buffer. Il iostream
in sé non fa un bel po '... soprattutto, è l'fornisce agli operatori di formattazione operator>>
. Il buffer è fornita da un oggetto derivato da basic_streambuf
, che si può ottenere e impostare utilizzando rdbuf()
.
basic_streambuf
è una base astratta con un numero di funzioni virtuali che sono forzate a fornire un'interfaccia uniforme per la lettura / scrittura di file, stringhe, ecc La basic_ostream<…>::operator<<( basic_streambuf<…> )
funzione è definita per mantenere lettura attraverso il buffer finché dei dati sottostante è esaurito .
iostream
è un terribile pasticcio, però.