std::basic_stringbuf<CharT,Traits,Allocator>::overflow
来自cppreference.com
< cpp | io | basic stringbuf
protected: virtual int_type overflow ( int_type c = Traits::eof()); | ||
后附字符 c 到输出字符序列。
如果 c 是文件尾指示符(traits::eq_int_type(c, traits::eof())==true),那么不会后附字符。函数不做任何操作并返回 traits::eof() 以外的未指定值。
否则,如果输出序列有可用的写位置,或此函数成功令一个写位置可用,那么就会调用 sputc(c) 并返回 c。
如果 std::stringbuf 为输出打开(mode & ios_base::out)!=0),那么此函数能令写位置可用:此时它会重分配(或在最初分配)足够大的缓冲区,以保有整个当前缓冲区加上至少一个字符。如果 std::stringbuf 也为输入打开((mode & ios_base::in)!=0),那么 overflow
也会通过移动 egptr() 到指向恰好越过新放置区的位置,来增加读取区域的大小。
目录 |
[编辑]参数
c | - | 要在写入区域存储的字符 |
[编辑]返回值
失败时返回指示失败的 Traits::eof()。成功后附字符 c 时返回 c。或以 Traits::eof() 为实参调用时返回某个 Traits::eof() 以外的值。
[编辑]注解
此函数与典型的 overflow()
不同,后者移动缓冲区的内容到关联字符序列,因为 std::basic_stringbuf 的缓冲区和关联序列是同一序列。
[编辑]示例
在用于执行此示例的实现(如 GCC-4.9)中,overflow()
过分配写入区域为 512 字节:调用 str() 只会返回四个初始字节,但剩下的 508 次对 sputc() 的调用不会要求对 overflow()
的新调用。
运行此代码
#include <sstream>#include <iostream> struct mybuf :std::stringbuf{ mybuf(conststd::string& new_str, std::ios_base::openmode which =std::ios_base::in|std::ios_base::out):std::stringbuf(new_str, which){} int_type overflow(int_type c =EOF) override {std::cout<<"调用 stringbuf::overflow('"<<char(c)<<"'\n"<<"调用前:读取区域大小:"<< egptr()- eback()<<'\n'<<" 写入区域大小:"<< epptr()- pbase()<<'\n'; int_type ret = std::stringbuf::overflow(c); std::cout<<"调用后:读取区域大小:"<< egptr()- eback()<<'\n'<<" 写入区域大小:"<< epptr()- pbase()<<'\n'; return ret;}}; int main(){std::cout<<"读写流:\n"; mybuf sbuf(" ");// 读写流std::iostream stream(&sbuf); stream <<1234;std::cout<< sbuf.str()<<'\n'; std::cout<<"\n只读流:\n"; mybuf ro_buf(" ", std::ios_base::in);// 只读流std::iostream ro_stream(&ro_buf); ro_stream <<1234; std::cout<<"\n只写流:\n"; mybuf wr_buf(" ", std::ios_base::out);// 只写流std::iostream wr_stream(&wr_buf); wr_stream <<1234;}
可能的输出:
读写流: 调用 stringbuf::overflow('4') 调用前:读取区域大小:3 写入区域大小:3 调用后:读取区域大小:4 写入区域大小:512 1234 只读流: 调用 stringbuf::overflow('1') 调用前:读取区域大小:3 写入区域大小:0 调用后:读取区域大小:3 写入区域大小:0 只写流: 调用 stringbuf::overflow('4') 调用前:读取区域大小:0 写入区域大小:3 调用后:读取区域大小:0 写入区域大小:512
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 169 | C++98 | (重)分配的缓冲区只能额外持有一个字符 | 可以额外持有多个字符 |
LWG 432 | C++98 | std::stringbuf 为输入打开时 overflow 会移动 epptr() 到指向恰好越过新放置区的位置 | 不会移动它 |
[编辑]参阅
[虚] | 从放置区写入字符到关联的输出序列 ( std::basic_streambuf<CharT,Traits> 的虚受保护成员函数) |
[虚] | 返回输入序列中可用的下一字符 (虚受保护成员函数) |