缓冲区类
类模板定义为basic_streambuf
,由<iostream>
给出:
1 stream缓冲区
- 通常stream不负责实际读写操作,而是stream buffer实现
- streambuf为缓冲区管理内存,并提供填充的缓冲区,访问缓冲区内容,刷新缓冲区和管理缓冲器内存的类方法。
- 通常,缓冲的大小为512字节或其倍数;
I / O流对象std::basic_istream,std::basic_ostream,衍生,是实现完全的std::basic_streambuf.
- 访问streambuf缓冲区的接口很复杂
- 对于输入,必须时刻监听未耗用的字符
- 解析时,字符最好能被送回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 | 退回到前一个字符 |
- 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方向 |
说明:
pubimbue()和getloc()用国际化议题。在stream中安装一个locale对象,并返回;getloc()返回当前的locale对象;
pubsetbuf():对缓冲区的缓冲策略进行控制,取决于具体的streambuf类;如string stream运用pubsetbuf()无效。用于file stream缓冲区,只能在第一个io操作后一pubsetbuf(0,0)方式才起作用;如果调用错误,返回0 ,否则返回缓冲区。
pubseekpos,pubseekoff控制读写操作的当前位置,最后一个参数是默认的(类型为:ios_base::openmode),决定读取位置
例子:
//-----省略-----
char mybuffer [512];
std::fstream filestr;
filestr.rdbuf()->pubsetbuf(mybuffer,512)
此示例中的代码为filestr的流缓冲区对象设置了一个512个字符的新缓冲区。