我有以下代码,它的效果非常好(除了它很慢,但我并不在乎)。这会将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;
}
有什么见解?
答案 0 :(得分:19)
iostream
类只是I / O缓冲区的包装器。 iostream
本身并没有做很多...主要是提供operator>>
格式化运算符。缓冲区由派生自basic_streambuf
的对象提供,您可以使用rdbuf()
获取和设置该对象。
basic_streambuf
是一个抽象基础,包含许多虚函数,这些函数被重写以提供读/写文件,字符串等的统一接口。函数basic_ostream<…>::operator<<( basic_streambuf<…> )
被定义为继续读取缓冲,直到基础数据源耗尽。
iostream
是一个可怕的混乱。
答案 1 :(得分:17)
是的,它在标准中指定,实际上非常简单。 rdbuf()
只返回指向给定basic_streambuf
对象的基础[io]stream
对象的指针。
basic_ostream<...>
对于operator<<
指针basic_streambuf<...>
有一个重载,该指针会写出basic_streambuf<...>
的内容。
答案 2 :(得分:1)
快速查看源代码可以发现basic_ofstream
是basic_filebuf
的包装。