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

Bri*_*nan 16 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;
}
Run Code Online (Sandbox Code Playgroud)

任何见解?

Pot*_*ter 20

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

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

iostream 但是,这是一个可怕的混乱.


CB *_*ley 17

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

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

  • 我不太确定你用'一块'开车的是什么?它被指定为逐个字符地输出指向"streambuf"字符的内容,直到到达缓冲区的末尾或输出它为止.`streambuf`是一个类实例,它是否将其受控序列存储在连续内存中是未指定的,不能从接口推断出来. (3认同)
  • 因此,大约有10,000个带有奇怪名称的标准,只有ISO员工才能理解它们的含义。您不仅不知道自己得到了什么,而且要从ISO获得一个真实标准的价格为300美元。这是荒唐的。我只想知道一件简单的小事,我必须购买一个愚蠢的标准。这些信息应该是免费的,并且随时可用,以便人们可以编写更好的代码。瘸!! (3认同)
  • 但不会运营商<<只写出一个块?不容易看出它会将整个事物写成一个块.我知道它是一个指向它的指针,但该指针是否包含整个数据作为一个块?我还是有点困惑. (2认同)
  • @Brian T Hannan:如果您阅读了相关问题的答案,您将找到所有相关标准的免费草稿的链接.这些将非常接近实际标准,并将成为最明确答案的最可靠的免费参考. (2认同)