输入输出流和streambuf的使用

C++ IO 体系

click on an element for detailed information

ios_base定义了同字符类型无关的属性和操作,istream和ostream分别定义了同输入和输出相关的操作,iostream同时支持输入和输出。它们负责字符串的可视化操作。如 >> << 流式操作重载。

由图可以看出,在stream 的实现中,除了虚基类IOS_BASE之外,所有的类内部都有一个streambuf,提供了缓冲功能和真正的操作外部设备的方法。streambuf 是一个虚基类不能被实例化,现有的标准库中,streambuf有两个子类,分别是stringbuf 和 filebuf,这两个子类可以被实例化。我们常用的文件流和字符串流,内部的缓冲区就是这两个类。如果需要订制自己的流处理方式,就可以从streambuf派生出自己的类。

streambuf 保护函数实现了缓冲区的管理,输入和输出功能。内部有三个get指针(gfirst,gnext,glast),三个put指针(pfirst,pnext,plast)。分别可以使用 eback(),gptr(),egptr()和pbase(),pptr(),epptr()获得。

缓冲区管理:

  • setbuf:设置缓冲区
  • seekoff:根据相对位置移动内部指针
  • seekpos:根据绝对位置移动内部指针
  • sync:同步缓冲区数据(flush)
  • showmanyc:得到流中可获取的字符数

输入功能

  • underflow(c):当缓冲区不可用时调用,用于获取流中当前的字符。不移动gnext,默认返回EOF
  • uflow():默认返回underflow,同时后移gnext。如果没有提供缓冲区,必须重写underflow和uflow
  • xsgetn(s,n):从流中读取n个字符到缓冲区中,并返回读取的字符数,默认多次调用sbumpc,可以重写以改善读取多个字符的性能。若当前缓冲区不可用,则调用一次uflow。
  • pbackfail:回写失败时调用
  • sgetc,sbumpc 读取一个字符,后者会将读取位置后移一个位置。如果没有提供缓冲区或缓冲区已满,sgetc会调用underflow,sbumpc会调用uflow,从外部设备读取更多数据。
  • sgetn:读取多个字符,会调用xsgen。

输出功能

  • overflow(c):当put缓冲区不可用时调用,将数据写入外部设备并清空缓冲区。当c==EOF时,流写入结束。对应输入函数uflow
  • xsputn(s,n):将缓冲区s的n个字符写入外部设备,并返回写入的字符数,默认对每个字符调用sputc,因此可以重写以优化多个字符输出。对应输入函数xsgetn。
  • sputc(输出一个字符),sputn(输出多个字符):如果提供了缓冲区,将复制到缓冲区,如果缓冲区已满或没有提供缓冲区,调用overflow。sputn会调用xsputn。

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件流和标准的输入输出流都是C++中的流,但是它们之间有着本质的区别。 标准的输入输出流(cin、cout、cerr等)是C++中的预定义流,用于与控制台进行交互。通过使用这些流,可以方便地从键盘读取输入数据,或者将输出数据打印到控制台上。 文件流是C++中用于进行文件输入输出的流。通过使用文件流,可以打开一个文件,从文件中读取数据,或者将数据写入到文件中。 文件流和标准的输入输出流之间的关系是:文件流可以使用标准的输入输出流进行流的重定向。例如,可以使用cout流将数据输出到文件中,或者使用cin流从文件中读取输入数据。具体方法如下: 1. 输出重定向:将cout流输出到文件中,可以使用ofstream类的构造函数,将文件名作为参数,并将ofstream对象与cout流进行绑定,例如: ``` ofstream out("output.txt"); streambuf* coutbuf = cout.rdbuf(); // 获取cout流的缓冲区指针 cout.rdbuf(out.rdbuf()); // 重定向cout流到文件中 cout << "Hello, world!" << endl; // 将数据输出到文件中 cout.rdbuf(coutbuf); // 恢复cout流的缓冲区指针 out.close(); ``` 2. 输入重定向:将cin流从文件中读取输入数据,可以使用ifstream类的构造函数,将文件名作为参数,并将ifstream对象与cin流进行绑定,例如: ``` ifstream in("input.txt"); streambuf* cinbuf = cin.rdbuf(); // 获取cin流的缓冲区指针 cin.rdbuf(in.rdbuf()); // 重定向cin流从文件中读取数据 int num; cin >> num; // 从文件中读取数据 cin.rdbuf(cinbuf); // 恢复cin流的缓冲区指针 in.close(); ``` 上述代码演示了如何使用文件流与标准的输入输出流进行流的重定向,使得数据可以从文件中读取或写入到文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值