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

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


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      // 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个字符的新缓冲区。

你可能感兴趣的:(stl)