代码之家  ›  专栏  ›  技术社区  ›  Brian T Hannan

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

  •  16
  • Brian T Hannan  · 技术社区  · 14 年前

    我有下面的代码,它工作得很好(除了速度很慢,但我不太在乎)。这将把中缀的全部内容写到外档似乎并不直观。

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

    有什么见解吗?

    2 回复  |  直到 14 年前
        1
  •  15
  •   CB Bailey    14 年前

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

    basic_ostream<...> 的超负荷 operator<< 指向的指针 basic_streambuf<...> 它写出了 基本“流”buf<…> .

        2
  •  18
  •   Potatoswatter R. Martinho Fernandes    14 年前

    iostream 类只是I/O缓冲区周围的包装器。这个 碘流 它本身并没有做太多的工作,主要是提供 operator>> 格式化运算符。缓冲区由派生自 basic_streambuf ,您可以使用 rdbuf() .

    基本流苏 是一个抽象基,其中包含许多虚拟函数,这些函数被重写以提供用于读取/写入文件、字符串等的统一接口。该函数 basic_ostream<…>::operator<<( basic_streambuf<…> ) 定义为在耗尽基础数据源之前一直读取缓冲区。

    碘流 不过,这真是一团糟。