void copy_stream( std::ostream & out, std::istream
& in)
{
char strBuffer[ 512];
while ( in.read( strBuffer, 512) )
{
int nCount = in.gcount();
out.write( strBuffer, nCount);
}
}
尽管它可以实现这个功能,但是还有一个简单很多的解决方案。它依赖于这样一个事实:你可以把输入流缓冲写到输出流和vice-versa。我们可以用.rdbuf()成员函数来获得流的底层流缓冲。
下面的代码可以把一个流拷贝到另外一个流。
#include <iostream>
#include <fstream>
void copy_stream1( std::ostream & out, std::istream & in)
{
out << in.rdbuf();
}
void copy_stream2( std::ostream & out, std::istream & in)
{
in >> out.rdbuf();
}
int main(int argc, char* argv[])
{
std::ifstream in1( "readme.txt");
std::ifstream in2( "readme.txt");
std::ofstream out1( "copy 1.txt");
std::ofstream out2( "copy 2.txt");
copy_stream1( out1, in1);
copy_stream2( out2, in2);
return 0;
}
下面是另一个写流缓冲的例子:把整个文件输出到std::cout:
std::ifstream in( "readme.txt");
std::cout << in.rdbuf();
用相似的方法,下面是如何把所有内容写到控制台:
std::ofstream out( "out.txt");
std::cin >> out.rdbuf();
注意上面的代码都没有考虑到例外。为此,我们可以使用exceptions()函数,但是要注意以下几点:
下面的代码解释了上面的规则:
// 不会抛出例外
in.exceptions( std::ios_base::goodbit);
out.exceptions( std::ios_base::failbit | std::ios_base::badbit);
in >> out.rdbuf();
// 可能会抛出例外
in.exceptions( std::ios_base::goodbit);
out.exceptions( std::ios_base::failbit | std::ios_base::badbit);
out << in.rdbuf();