Что делает ifstream :: rdbuf () на самом деле? - PullRequest
16 голосов
/ 26 января 2010

У меня есть следующий код, и он работает довольно хорошо (за исключением того, что он довольно медленный, но меня это не волнует). Не кажется интуитивно понятным, что это запишет все содержимое файла в файл.

// 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;
}

Есть идеи?

Ответы [ 2 ]

19 голосов
/ 27 января 2010

iostream классы - это просто оболочки вокруг буферов ввода / вывода. Сам по себе iostream ничего не делает ... в основном, он обеспечивает operator>> операторы форматирования. Буфер предоставляется объектом, полученным из basic_streambuf, который вы можете получить и установить с помощью rdbuf().

basic_streambuf является абстрактной базой с рядом виртуальных функций, которые переопределяются для обеспечения единого интерфейса для чтения / записи файлов, строк и т. Д. Функция basic_ostream<…>::operator<<( basic_streambuf<…> ) определена для продолжения чтения через буфер до нижележащего источник данных исчерпан.

iostream ужасный беспорядок, хотя.

17 голосов
/ 26 января 2010

Да, это указано в стандарте, и на самом деле это довольно просто. rdbuf() просто возвращает указатель на базовый basic_streambuf объект для данного [io]stream объекта.

basic_ostream<...> имеет перегрузку для operator<< для указателя на basic_streambuf<...>, который записывает содержимое basic_streambuf<...>.

...