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?

È stato utile?

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ò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top