七、输入/输出流--streambuffer类介绍--

缓冲区类
类模板定义为basic_streambuf,由<iostream>给出:


1 stream缓冲区

  1. 通常stream不负责实际读写操作,而是stream buffer实现
  2. streambuf为缓冲区管理内存,并提供填充的缓冲区,访问缓冲区内容,刷新缓冲区和管理缓冲器内存的类方法。
  3. 通常,缓冲的大小为512字节或其倍数;

I / O流对象std::basic_istream,std::basic_ostream,衍生,是实现完全的std::basic_streambuf.

  1. 访问streambuf缓冲区的接口很复杂
  2. 对于输入,必须时刻监听未耗用的字符
  3. 解析时,字符最好能被送回streambuf缓冲区

有两个成员函数用于写入

  • sputc(c):字符c写入缓冲区,指向下一个位置
  • sputn(s,n):将s字符串的n个字符写入到缓冲区中
    两个函数失败返回: traits_type: eof()

1.1 streambuffer类的公用成员函数(输入):

函数含义
in_avail返回有效字符的下界,即总数
snextc将受控输入序列的当前位置提前到下一个字符,并返回下一个字符。
sbumpc返回当前字符,并且指向下一个字符
sgetc返回当前字符,指向位置不变
sgetn(s,n)输入序列中读取字符,存储在s数组中,直到提取了n个字符或达到序列的结尾。
sputbackc(c)尝试将缓冲区的指向位置指示符移回到c字符。即字符c之后的位置重新写入到缓冲区之中
sungetc退回到前一个字符
  1. sgetc,snextc,sbumpc如果调用失败,返回traits_type: eof()

例子:

#include <iostream>     // std::cin, std::cout, std::streambuf, std::streamsize
//---------省略-------------
    char ch;
    streambuf * pbuf = std::cin.rdbuf();//返回相关联的流缓冲区

    cout << "输入一串字符和数字: ";
    do {
        ch = pbuf->sbumpc();//返回当前字符,指向下一个位置

        if ((ch >= '0') && (ch <= '9')){
            pbuf->sputbackc(ch);//缓冲区指向字符ch
            string n;
            cin >> n;
            cout << "你输入的数字和之后的内容为: " << n << '\n';
            break;
        }
    }while (ch != EOF);

结果为:

输入一串字符和数字: abc123efg
你输入的数字和之后的内容为: 123efg

1.2 其他stream buffer公用成员函数

函数定义
pubimbue(const locale& loc)关联locale对象loc到流缓冲区。
getloc()返回当前的locale
pubsetbuf(s,n)影响缓冲行为,给s指向数组分配n个大小的缓冲区
pubseekpos ( pos, which = ios_base::in | ios_base::out)将当前位置重新定位某绝对位置,并且指定io方向
pubseekoff (off,way,which = ios_base::in | ios_base::out);将当前位置重新定位另一位置的相对位置,并指定io方向

说明:

  1. pubimbue()和getloc()用国际化议题。在stream中安装一个locale对象,并返回;getloc()返回当前的locale对象;

  2. pubsetbuf():对缓冲区的缓冲策略进行控制,取决于具体的streambuf类;如string stream运用pubsetbuf()无效。用于file stream缓冲区,只能在第一个io操作后一pubsetbuf(0,0)方式才起作用;如果调用错误,返回0 ,否则返回缓冲区。

  3. pubseekpos,pubseekoff控制读写操作的当前位置,最后一个参数是默认的(类型为:ios_base::openmode),决定读取位置

例子:

//-----省略-----
  char mybuffer [512];
  std::fstream filestr;
  filestr.rdbuf()->pubsetbuf(mybuffer,512)

此示例中的代码为filestr的流缓冲区对象设置了一个512个字符的新缓冲区。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值