2010-01-26 254 views
13

我有以下代码,它工作得很好(除了它很慢的事实,但我不太在意)。这似乎并不直观,它会将整个infile的内容写入outfile。ifstream :: rdbuf()实际上做了什么?

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

任何见解?

+1

我想补充一点,不需要对close()进行显式调用。无论如何,析构函数都会这样做。这节省了一些线。 ;) – 2015-05-22 22:15:59

回答

12

是的,它是在标准中指定的,它其实很简单。 rdbuf()只是返回一个指针,指向给定的[io]stream对象的基础basic_streambuf对象。

basic_ostream<...>对于指向basic_streambuf<...>operator<<有一个过载,其中写出basic_streambuf<...>的内容。

+2

但是不会运营商<<只写出一个块?不容易看出它会把整个事情写成一个大块。我知道这是一个指向它的指针,但该指针是否包含整个数据作为一个块?我仍然有点困惑。 – 2010-01-26 19:12:03

+3

我不太确定你在驾驶'一个大块头'?它被指定为逐字符输出指向'streambuf'的内容,直到达到缓冲区的末尾或输出错误。 'streambuf'是一个类实例,它是否将其受控序列存储在连续内存中没有被指定,并且不能从接口推断出来。 – 2010-01-26 19:17:56

+0

好吧,它会逐字符地执行,直到达到缓冲区的末尾。你怎么知道?我没有从提供的界面中看到。 – 2010-01-26 19:33:56

15

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

basic_streambuf是与一些其是重写,以提供用于读/写文件,字符串,一个统一的接口虚拟函数的抽象基等功能basic_ostream<…>::operator<<(basic_streambuf<…>)被定义为保持通过所述缓冲器读取直到底层数据源是累。

iostream虽然是一个可怕的混乱。

+0

我同意,这是一个很好的答案,但查尔斯首先提交了他的答案,所以他是赢家。我虽然赞成你的答案! – 2010-01-26 23:33:29

相关问题