七、输入/输出流--基于字符串的流---streambuf类

来源:互联网 发布:三菱plcfx3u编程软件 编辑:程序博客网 时间:2024/05/31 19:27

基于字符串的流

在头文件<sstream>中,定义了4个类模板和6个类型,,都是和basic_string相关的流缓冲区类型;其功能是将流附着在string上,即通过流提过的格式化功能,从string中读取或者写入到string中,这样的流被称为stringstream.

template<     class CharT,     class Traits = std::char_traits<CharT>,    class Allocator = std::allocator<CharT>> class basic_stringstream;

1 streambuf类

类模板basic_stringbuf定义为:

template < class charT,                           // basic_stringbuf::char_type           class traits = char_traits<charT>,     // basic_stringbuf::traits_type           class Alloc = allocator<charT>         // basic_stringbuf::allocator_type           > class basic_stringbuf;

1.1 basic_stringbuf构造函数

//default (1)   explicit basic_stringbuf (ios_base::openmode which = ios_base::in | ios_base::out);//initialization (2)    explicit basic_stringbuf (const basic_string<char_type,traits_type,allocator_type>& str,                          ios_base::openmode which = ios_base::in | ios_base::out);//copy (3)  basic_stringbuf (const basic_stringbuf&) = delete;//move (4)  basic_stringbuf (basic_stringbuf&& x);

说明:
1. 前两个构造函数主要功能时构造基类basic_stringbuf的对象,并且初始化基类,使用参数which初始化模式;
2. 第三个: 禁止复制拷贝构造函数
3. 第四个: 右值构造函数

1.2 basic_stringbuf成员函数

//get (1)   basic_string<char_type,traits_type,allocator_type> str() const;//set (2)   void str (const basic_string<char_type,traits_type,allocator_type>& str);

说明:
1. 一个是get函数,一个是set函数功能
2. str()功能就是获取字符串缓冲区的内容,或者初始化输入、输出序列;
3. 第一个:返回一个basic_string对象,其中包含流缓冲区中当前内容的副本。
4. 第二个:将str设置为流缓冲区的内容,丢弃任何先前的内容。该对象保留其打开模式:如果这包括ios_base::ate,则put指针(pptr)将移动到新序列的末尾。

1.3 basic_stringbuf重载的虚函数

重载了6个虚函数

//(1)int_type underflow();//(2)int_type overflow (int_type c = traits_type::eof());//(3)int_type pbackfail (int_type c = traits_type::eof());//(4)pos_type seekpos (pos_type pos, ios_base::openmode which = ios_base::in | ios_base::out);//(5)pos_type seekoff (off_type off, ios_base::seekdir way,                  ios_base::openmode which = ios_base::in | ios_base::out);//(6)                  basic_streambuf* setbuf (char_type* s, streamsize n);

说明:

1.3.1 underflow()函数

虚函数underflow()将参数指定的字符放入输入缓冲区,如果可能有以下情况:

(1). 如果输入序列的当前位置有效,并且

  • traits::eq_int_type(c,traits::eof())返回false,:说明c不是文件终止字符
  • 并且traits::eq(to_char_type(c),gptr()[-1])返回true,
  • assigns gptr()-1 to gptr()

这三个条件成立,函数返回字符c

(2).如果traits::eq_int_type(c,traits::eof())返回false,并且输入序列当前位置有效,模式为输出(ios::out)时候,指定字符给*(–gptr()),函数返回traits::not_eof(c);

总结: traits::eof()表明函数调用失败


1.3.2 overflow()函数

成员函数overflow()功能: 将参数指定的字符c送入输出缓冲区,有下面的几种情况:
(1). 当traits::eq_int_type(c,traits::eof())返回false,并输出缓冲区当前位置有效,函数会调用sputc(c),调用成功,返回字符c;
(2). 如果traits::eq_int_type(c,traits::eof())返回true,并且没有字符被添加,函数调用成功时,返回一个数值,调用失败,返回traits::eof()


1.3.3 其他函数

  1. seekoff()功能时:在两个缓冲区中。改变流的位置;
  2. seekpos()功能类似;
  3. setbuf():设置缓冲区
阅读全文
0 0
原创粉丝点击