Was bedeutet ifstream :: RDBUF () eigentlich?
Frage
Ich habe den folgenden Code und es funktioniert recht gut (abgesehen von der Tatsache, dass es ziemlich langsam ist, aber ich weiß nicht viel darüber). Es scheint nicht intuitiv, dass dies den gesamten Inhalt des infile zum outfile schreiben würde.
// 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;
}
Jede Einsicht?
Lösung
Ja, es ist in der Norm festgelegt und es ist eigentlich ganz einfach. rdbuf()
nur gibt einen Zeiger auf das darunter liegende basic_streambuf
Objekt für das gegebene [io]stream
Objekt.
basic_ostream<...>
hat eine Überlastung für operator<<
für einen Zeiger auf basic_streambuf<...>
, die den Inhalt des basic_streambuf<...>
schreibt.
Andere Tipps
iostream
Klassen sind nur Wrapper um I / O-Puffer. Die iostream
selbst macht nicht viel ... vor allem, es ist die operator>>
Formatierung Betreiber zur Verfügung stellt. Der Puffer wird durch ein Objekt zur Verfügung gestellt von basic_streambuf
abgeleitet, die Sie erhalten und Set können rdbuf()
verwendet wird.
basic_streambuf
eine abstrakte Basis mit einer Reihe von virtuellen Funktionen, die eine einheitliche Schnittstelle zur Verfügung zu stellen für das Lesen / Schreiben von Dateien überschrieben werden, Strings, usw. Die Funktion basic_ostream<…>::operator<<( basic_streambuf<…> )
ist definiert durch den Puffer zu lesen Sie, bis die zugrunde liegende Datenquelle erschöpft ist .
iostream
ist eine schreckliche Unordnung, though.