Что делает ifstream:: rdbuf() на самом деле?
У меня есть следующий код, и он работает очень хорошо (за исключением того, что он довольно медленный, но меня это не волнует). Не кажется интуитивным, что это напишет все содержимое 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;
}
Любое понимание?
Ответы
Ответ 1
Да, это указано в стандарте, и на самом деле это довольно просто. rdbuf()
просто возвращает указатель на базовый объект basic_streambuf
для данного объекта [io]stream
.
basic_ostream<...>
имеет перегрузку для operator<<
для указателя на basic_streambuf<...>
, который записывает содержимое basic_streambuf<...>
.
Ответ 2
iostream
классы - это всего лишь обертки вокруг буферов ввода-вывода. Сам iostream
не делает много... в основном, он предоставляет операторы форматирования operator>>
. Буфер предоставляется объектом, полученным из basic_streambuf
, который вы можете получить и установить с помощью rdbuf()
.
basic_streambuf
- абстрактная база с множеством виртуальных функций, которые переопределяются, чтобы обеспечить единый интерфейс для чтения/записи файлов, строк и т.д. Функция basic_ostream<…>::operator<<( basic_streambuf<…> )
определена для продолжения чтения через буфер до тех пор, пока основной источник данных исчерпан.
iostream
- ужасный беспорядок, однако.