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

29
我有下面的代码,它运行得很好(除了它非常慢之外,但我不太在意)。这似乎并不直观,它会将整个 infile 的内容写入到 outfile 中。

我有以下代码,它工作得很好(尽管它相当缓慢,但我不太关心)。不直观的是,它将整个 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;
}

有什么见解吗?


4
我想补充一点,明确调用close()是不必要的。析构函数会自动执行相同的操作,这样可以节省几行代码。 ;) - Adam Badura
3个回答

30
类只是I/O缓冲区的包装器。 本身并没有做很多事情...主要提供了>格式化运算符。缓冲区由从派生的对象提供,您可以使用来获取和设置。

是一个抽象基类,具有许多虚函数,这些函数被重写以提供统一的读/写文件、字符串等接口。函数::operator<<(basic_streambuf<...>)>被定义为在数据源耗尽之前持续读取缓冲区。

然而,是一个糟糕的混乱。


19

是的,这在标准中有明确规定,并且实际上非常简单。rdbuf()仅返回给定[io]stream对象的基础basic_streambuf对象的指针。

basic_ostream<...>重载了 operator<<,它接受一个basic_streambuf<...>指针,并将basic_streambuf<...>的内容写出。


2
但是operator<<不仅仅只会写出一个块吗?很难看出它将作为一个整体全部写出。我知道它是指向它的指针,但是那个指针是否包含整个数据作为一个整块?我还有点困惑。 - Brian T Hannan
3
“one chunk”是什么意思我不太确定?该函数将按字符输出指向streambuf的内容,直到达到缓冲区的末尾或输出时发生错误。streambuf是一个类实例,它是否在连续的内存中存储其受控序列并未指定,也无法从接口中推断出来。 - CB Bailey
5
有大约10,000个标准,其名称很奇怪,只有ISO的人才能理解它们的含义。你不仅不知道自己得到了什么,而且从ISO购买一个真正的标准需要300美元。这太荒唐了。我只想知道一件简单的小事情,却必须购买一个愚蠢的标准。这些信息应该是免费和易于获取的,以便人们能够编写更好的代码。太烂了!! - Brian T Hannan
2
@Brian T Hannan:如果您阅读链接问题的答案,您会发现所有相关标准的免费草稿链接。这些草稿非常接近实际标准,并且将是最可靠的免费参考资料,以获得明确的答案。 - CB Bailey
1
@Eric Malenfant:谢谢!我在错误的地方寻找。我一直在查看 ifstream 文档,但实际上工作是在 "ostream::operator<<" 中进行的。现在清晰易懂多了。 - Brian T Hannan
显示剩余5条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接