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 的缓冲区和关联序列是同一序列。

示例

在用于执行此示例的实现中,overflow() 过分配写入区域为 512 字节:调用 str() 只会返回四个初始字节,但剩下的 508 次对 sputc() 的调用不会要求对 overflow() 的新调用。

#include <sstream>
#include <iostream>
 
struct mybuf : std::stringbuf
{
    mybuf(const std::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> 的虚受保护成员函数)
返回输入序列中可用的下一字符
(虚受保护成员函数)