23

我有以下代码,它工作得很好(除了它很慢,但我不太在意)。将输入文件的全部内容写入输出文件似乎并不直观。

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

有什么见解吗?

4

3 回答 3

28

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

basic_streambuf是一个抽象基础,具有许多虚拟函数,这些虚拟函数被重写以提供用于读取/写入文件、字符串等的统一接口。该函数basic_ostream<…&gt;::operator<<( basic_streambuf<…&gt; )被定义为继续读取缓冲区,直到底层数据源耗尽。

iostream不过,这是一个可怕的混乱。

于 2010-01-26T23:27:18.147 回答
19

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

basic_ostream<...>operator<<一个指针的重载,该指针basic_streambuf<...>写出basic_streambuf<...>.

于 2010-01-26T18:51:09.537 回答
1

快速查看源代码可以看出它basic_ofstreambasic_filebuf.

于 2020-06-09T07:41:54.797 回答