七、输入/输出流--streambuffer类介绍--缓冲区迭代器


2 缓冲区迭代器

缓冲区和其他存储空间一样,可以使用迭代器访问;

  1. 模板类istreambuf_iterator和ostreambuf_iterator用于从basic_streambuf的对象中读取或写入单个字符。

  2. 包含于头文件中;

  3. 与流迭代器唯一区别是: 元素是字符

2.1 Output 缓冲区迭代器

原型为:

template< class CharT, class Traits = std::char_traits>
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);
  1. 第二行:根据cout构造一个输出迭代器
  2. 第三行: 将字符串复制到缓冲区,并且输出到屏幕

输出缓冲迭代器的成员函数:

  • ostreambuf_iterator(ostream) : 为流ostream产生一个迭代器

  • ostreambuf_iterator(buff_ptr):为buff_ptr指向的缓冲区产
    生一个迭代器

  • *iter:无操作,返回iter

  • iter = c : 调用sputc(),对缓冲区写入字符

  • ++iter/iter++ : 无操作,返回iter

  • failed() : 判断输出流迭代器能够执行改写操作

2.2 input stream缓冲区迭代器

  1. 输入流缓冲区迭代器和流istream迭代器所有操作类似
  2. 成员函数equal()判断两个输入流缓冲区迭代器是否相等,当两个迭代器都是或者都不是end-of-stream迭代器时,相等;

各项操作:

成员函数 含义
istreambuf_iterator() 产生一个end-of-stream迭代器
istreambuf_iterator(istream) 为istream产生一个输入缓冲区迭代器,并可能掉头sgetc()获取第一个字符
istreambuf_iterator(buff_ptr) 为缓冲区buff_ptr产生一个输入缓冲迭代器,并调用sgetc()获取第一个字符
*iter 返回当前字符
++iter 以sbumpc读取下一个字符,返回其位置
iter++ 以sbumpc读取下一个字符,返回一个迭代器
equal()/ == 判断两个迭代器相等
!= 判断两个迭代器不等

说明:
1. 从流的当前位置到结尾: 由两个迭代器定义:istreambuf_iterator(istream)表示开始,istreambuf_iterator()表示结尾;
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
请按任意键继续. . .

你可能感兴趣的:(stl)