ifstream :: rdbuf()实际上做了什么?
我有以下代码,它工作得很好(除了它很慢的事实,但我不太在意)。这似乎并不直观,它会将整个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;
}
任何见解?
是的,它是在标准中指定的,它其实很简单。 rdbuf()
只是返回一个指针,指向给定的[io]stream
对象的基础basic_streambuf
对象。
basic_ostream<...>
对于指向basic_streambuf<...>
的operator<<
有一个过载,其中写出basic_streambuf<...>
的内容。
但是不会运营商 2010-01-26 19:12:03
我不太确定你在驾驶'一个大块头'?它被指定为逐字符输出指向'streambuf'的内容,直到达到缓冲区的末尾或输出错误。 'streambuf'是一个类实例,它是否将其受控序列存储在连续内存中没有被指定,并且不能从接口推断出来。 – 2010-01-26 19:17:56
好吧,它会逐字符地执行,直到达到缓冲区的末尾。你怎么知道?我没有从提供的界面中看到。 – 2010-01-26 19:33:56
iostream
类只是I/O缓冲区的包装。 iostream
本身并没有做很多...主要是它提供了格式化运算符operator>>
。缓冲区由来自basic_streambuf
的对象提供,您可以使用rdbuf()
来获取和设置缓冲区。
basic_streambuf
是与一些其是重写,以提供用于读/写文件,字符串,一个统一的接口虚拟函数的抽象基等功能basic_ostream<…>::operator<<(basic_streambuf<…>)
被定义为保持通过所述缓冲器读取直到底层数据源是累。
iostream
虽然是一个可怕的混乱。
我同意,这是一个很好的答案,但查尔斯首先提交了他的答案,所以他是赢家。我虽然赞成你的答案! – 2010-01-26 23:33:29
我想补充一点,不需要对close()进行显式调用。无论如何,析构函数都会这样做。这节省了一些线。 ;) – 2015-05-22 22:15:59