在C++中读写流缓冲

ZDNet软件频道 时间:2003-06-03 作者:ZDNet China |  我要评论()
本文关键词:cpptips
STL允许我们用“<<”和“>>”运算符来轻松读写流。然而,有些时候你需要把整个流拷贝到另外一个流。该如何处理呢?
本文译自Builder.com,未经许可请勿转载STL允许我们用“<<”和“>>”运算符来轻松读写流。然而,有些时候你需要把整个流拷贝到另外一个流。在这种情况下,你可能会编写一个如下的函数:

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 >> out.rdbuf()时,可能仅基于in.exceptions()就抛出一个例外。
  • 当你使用out << in.rdbuf(),可能仅基于out.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();



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134