У меня есть следующий код, и он работает довольно хороший (кроме того, что это довольно медленно, но я не забочусь очень об этом). Это не кажется интуитивным, что это записало бы все содержание infile к 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;
}
Понимание?
Да, это указано в стандарте и на самом деле довольно просто. rdbuf()
просто возвращает указатель на лежащий в основе объекта basic_streambuf
для данного объекта [io]stream
.
base_ostream<...>
имеет перегрузку для оператора <<
для указателя на basic_streambuf<...>
, который записывает содержимое basic_streambuf<...>
.
IOSTream
Классы - это просто обертки вокруг буферов ввода / вывода. Сам IOSTREAM
сам не проходит много ... в основном, он предлагает Оператор >>
операторы форматирования. Буфер предоставляется объектом, полученным из basic_streambuf
, который вы можете получить и установить использование RDBUF ()
.
BASIC_STREAMBUF
- это абстрактная база с рядом виртуальных функций, которые переопределены для обеспечения единого интерфейса для чтения / записи файлов, строк и т. Д. Функция Basic_ostream <...> :: Оператор << ( BASIC_STREAMBUF <...>)
определяется для того, чтобы продолжать чтение через буфер до тех пор, пока базовый источник данных не будет исчерпан.
IoStream
- это ужасный беспорядок, хотя.