ifstream :: rdbuf()实际上做了什么?

时间:2010-01-26 18:48:09

标签: c++ ifstream

我有以下代码,它的效果非常好(除了它很慢,但我并不在乎)。这会将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;
}

有什么见解?

3 个答案:

答案 0 :(得分:19)

iostream类只是I / O缓冲区的包装器。 iostream本身并没有做很多...主要是提供operator>>格式化运算符。缓冲区由派生自basic_streambuf的对象提供,您可以使用rdbuf()获取和设置该对象。

basic_streambuf是一个抽象基础,包含许多虚函数,这些函数被重写以提供读/写文件,字符串等的统一接口。函数basic_ostream<…>::operator<<( basic_streambuf<…> )被定义为继续读取缓冲,直到基础数据源耗尽。

然而,

iostream是一个可怕的混乱。

答案 1 :(得分:17)

是的,它在标准中指定,实际上非常简单。 rdbuf()只返回指向给定basic_streambuf对象的基础[io]stream对象的指针。

basic_ostream<...>对于operator<<指针basic_streambuf<...>有一个重载,该指针会写出basic_streambuf<...>的内容。

答案 2 :(得分:1)

快速查看源代码可以发现basic_ofstreambasic_filebuf的包装。