Что делает 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;
}

Понимание?

16
задан Brian T Hannan 26 January 2010 в 19:13
поделиться

2 ответа

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

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

17
ответ дан 30 November 2019 в 16:42
поделиться

IOSTream Классы - это просто обертки вокруг буферов ввода / вывода. Сам IOSTREAM сам не проходит много ... в основном, он предлагает Оператор >> операторы форматирования. Буфер предоставляется объектом, полученным из basic_streambuf , который вы можете получить и установить использование RDBUF () .

BASIC_STREAMBUF - это абстрактная база с рядом виртуальных функций, которые переопределены для обеспечения единого интерфейса для чтения / записи файлов, строк и т. Д. Функция Basic_ostream <...> :: Оператор << ( BASIC_STREAMBUF <...>) определяется для того, чтобы продолжать чтение через буфер до тех пор, пока базовый источник данных не будет исчерпан.

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

20
ответ дан 30 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: