【问题标题】:What does ifstream::rdbuf() actually do?ifstream::rdbuf() 实际上做了什么?
【发布时间】:2011-01-09 15:35:28
【问题描述】:

我有以下代码,它工作得很好(除了它很慢,但我不太在意)。将 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;
}

有什么见解吗?

【问题讨论】:

  • 我要补充一点,不需要显式调用close()。无论如何,析构函数都会做同样的事情。这样可以节省一些行。 ;)

标签: c++ ifstream


【解决方案1】:

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

basic_ostream&lt;...&gt;operator&lt;&lt; 有一个重载,指向basic_streambuf&lt;...&gt; 的指针写出basic_streambuf&lt;...&gt; 的内容。

【讨论】:

  • 但是 operator
  • 我不太确定你用“一大块”在做什么?指定逐个字符输出指向streambuf的内容,直到到达缓冲区末尾或输出出错。 streambuf 是一个类实例,它是否将其受控序列存储在连续内存中没有指定,也无法从接口推断。
  • 因此,大约有 10,000 个标准名称怪异,只有 ISO 人员才能理解它们的含义。您不仅不知道自己得到了什么,而且 ISO 的真正标准要花费 300 美元。这是荒唐的。我只想知道一件简单的小事,我不得不买一个愚蠢的标准。这些信息应该是免费且随时可用的,以便人们可以编写更好的代码。跛脚!!
  • @Brian T Hannan:如果您阅读链接问题的答案,您会发现所有相关标准的免费可用草案的链接。这些将非常接近实际标准,并将成为最可靠的免费参考,以获得明确的答案。
  • @Eric Malenfant:谢谢!我找错地方了。我正在查看 ifstream 文档,但实际上正在完成工作的地方是在“ostream::operator
【解决方案2】:

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

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

iostream 不过是一团糟。

【讨论】:

    【解决方案3】:

    快速查看源代码表明basic_ofstreambasic_filebuf 的包装器。

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2020-11-21
      • 2015-02-26
      • 2017-06-29
      • 2013-06-13
      • 2021-10-25
      • 2011-08-12
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多