2 缓冲区迭代器
缓冲区和其他存储空间一样,可以使用迭代器访问;
模板类istreambuf_iterator和ostreambuf_iterator用于从basic_streambuf的对象中读取或写入单个字符。
包含于头文件
<iterator>
中;- 与流迭代器唯一区别是: 元素是字符
2.1 Output 缓冲区迭代器
原型为:
template< class CharT, class Traits = std::char_traits<CharT>>
class ostreambuf_iterator
例子:
//--------------省略------------
string mystring ("Some text here...\n");
ostreambuf_iterator<char> out_it (std::cout); // stdout iterator
copy ( mystring.begin(), mystring.end(), out_it);
- 第二行:根据cout构造一个输出迭代器
- 第三行: 将字符串复制到缓冲区,并且输出到屏幕
输出缓冲迭代器的成员函数:
ostreambuf_iterator(ostream) : 为流ostream产生一个迭代器
ostreambuf_iterator(buff_ptr):为buff_ptr指向的缓冲区产
生一个迭代器*iter:无操作,返回iter
iter = c : 调用sputc(),对缓冲区写入字符
++iter/iter++ : 无操作,返回iter
failed() : 判断输出流迭代器能够执行改写操作
2.2 input stream缓冲区迭代器
- 输入流缓冲区迭代器和流istream迭代器所有操作类似
- 成员函数equal()判断两个输入流缓冲区迭代器是否相等,当两个迭代器都是或者都不是end-of-stream迭代器时,相等;
各项操作:
成员函数 | 含义 |
---|---|
istreambuf_iterator<char>() | 产生一个end-of-stream迭代器 |
istreambuf_iterator<char>(istream) | 为istream产生一个输入缓冲区迭代器,并可能掉头sgetc()获取第一个字符 |
istreambuf_iterator<char>(buff_ptr) | 为缓冲区buff_ptr产生一个输入缓冲迭代器,并调用sgetc()获取第一个字符 |
*iter | 返回当前字符 |
++iter | 以sbumpc读取下一个字符,返回其位置 |
iter++ | 以sbumpc读取下一个字符,返回一个迭代器 |
equal()/ == | 判断两个迭代器相等 |
!= | 判断两个迭代器不等 |
说明:
1. 从流的当前位置到结尾: 由两个迭代器定义:istreambuf_iterator<char>(istream)
表示开始,istreambuf_iterator<char>()
表示结尾;
2. 不可能以istream_iterators建立一个子序列;
例子:
//------------------省略---------------------
ostreambuf_iterator<char> bufferwriter(cout);//cout缓冲区迭代器
string s = "hello,world!";
copy(s.begin(), s.end(), bufferwriter);//输出
istreambuf_iterator<char> isbuffer(cin);//输入缓冲区迭代器
istreambuf_iterator<char> eof;//流的结束
while (isbuffer !=eof)//输入不为空
{
*bufferwriter++ = *isbuffer++;//输出
}
结果为;
hello,world!
abcdefg,haha
abcdefg,haha
efg efg
efg efg
^Z
请按任意键继续. . .