命名空间
变体
操作

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() 的调用只会返回四个已初始化的字节,但对 sputc() 的接下来的 508 次调用将不需要新的 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) << "') called\n"
                  << "Before: size of get area: " << egptr() - eback() << '\n'
                  << "        size of put area: " << epptr() - pbase() << '\n';
 
        int_type ret = std::stringbuf::overflow(c);
 
        std::cout << "After : size of get area: " << egptr() - eback() << '\n'
                  << "        size of put area: " << epptr() - pbase() << '\n';
 
        return ret;
    }
};
 
int main()
{
    std::cout << "read-write stream:\n";
    mybuf sbuf("   "); // read-write stream
    std::iostream stream(&sbuf);
    stream << 1234;
    std::cout << sbuf.str() << '\n';
 
    std::cout << "\nread-only stream:\n";
    mybuf ro_buf("   ", std::ios_base::in); // read-only stream
    std::iostream ro_stream(&ro_buf);
    ro_stream << 1234;
 
    std::cout << "\nwrite-only stream:\n";
    mybuf wr_buf("   ", std::ios_base::out); // write-only stream
    std::iostream wr_stream(&wr_buf);
    wr_stream << 1234;
}

可能的输出

read-write stream:
stringbuf::overflow('4') called
Before: size of get area: 3
        size of put area: 3
After : size of get area: 4
        size of put area: 512
1234
 
read-only stream:
stringbuf::overflow('1') called
Before: size of get area: 3
        size of put area: 0
After : size of get area: 3
        size of put area: 0
 
write-only stream:
stringbuf::overflow('4') called
Before: size of get area: 0
        size of put area: 3
After : size of get area: 0
        size of put area: 512

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 169 C++98 重新分配的缓冲区只能容纳一个额外字符 允许更多额外字符
LWG 432 C++98 overflowepptr() 移动到指向新的
写入位置,如果 std::stringbuf 对输入开放
它不会移动

[编辑] 另请参阅

[virtual]
从放置区域写入字符到关联的输出序列
(std::basic_streambuf<CharT,Traits> 的虚拟受保护成员函数) [编辑]
[virtual]
返回输入序列中可用的下一个字符
(虚拟受保护成员函数) [编辑]