std::strstreambuf::overflow

出自cppreference.com
< cpp‎ | io‎ | strstreambuf
protected:
virtual int_type overflow (int_type c = EOF);
(C++98 棄用)
(C++26 移除)

後附字符 c 到緩衝區的放置區,若可能則重分配。

1)c == EOF,則不做任何事
2) 否則,若放置區擁有可用的寫位置(pptr() < epptr()),則如同用 *pptr()++ = c 存儲該字符。
3) 否則,若流緩衝區模式非動態,或流當前已凍結,則函數失敗並返回 EOF
4) 否則,函數重分配(或初始分配)大小足夠保有當前動態數組(若存在)加至少一個額外寫入位置的動態數組。若構造函數中使用了指向分配函數的指針 palloc,則以 (*palloc)(n) 調用該函數,否則用 new char[n],其中 n 為要分配的字節數。若構造函數中使用了指向解分配函數的指針 pfree,則以 (*pfree)(p) 調用該函數分配先前的數組,否則用 delete[] p,若需要解分配。若分配失敗,則函數失敗並返回 EOF

目錄

[編輯] 參數

c - 要存儲於放置區的字符

[編輯] 返回值

c == EOF,則返回異於 EOF 的某值。否則,成功時返回 (unsigned char)(c),失敗時返回 EOF

[編輯] 示例

#include <iostream>
#include <strstream>
 
struct mybuf : std::strstreambuf
{
    int_type overflow(int_type c) 
    {
        std::cout << "overflow() 前:放置区的大小为 " << epptr()-pbase()
                  << ",有 " << epptr()-pptr() << " 个可用写入位置\n";
        int_type rc = std::strstreambuf::overflow(c);
        std::cout << "overflow() 后:放置区的大小为 " << epptr()-pbase()
                  << ",有 " << epptr()-pptr() << " 个可用写入位置\n";
        return rc;
    }
};
 
int main()
{
    mybuf sbuf; // 读写动态 strstreambuf
    std::iostream stream(&sbuf);
 
    stream << "Sufficiently long string to overflow the initial allocation, at least "
           << " on some systems.";
}

可能的輸出:

overflow() 前:放置区的大小为 16,有 0 个可用写入位置
overflow() 后:放置区的大小为 32,有 15 个可用写入位置
overflow() 前:放置区的大小为 32 个 0 个可用写入位置
overflow() 后:放置区的大小为 64 个 31 个可用写入位置
overflow() 前:放置区的大小为 64 个 0 个可用写入位置
overflow() 后:放置区的大小为 128 个 63 个可用写入位置

[編輯] 參閱

從放置區寫入字符到關聯的輸出序列
(std::basic_streambuf<CharT,Traits> 的虛受保護成員函數) [編輯]
後附字符到輸出序列
(std::basic_stringbuf<CharT,Traits,Allocator> 的虛受保護成員函數) [編輯]
從放置區寫字符到關聯的文件
(std::basic_filebuf<CharT,Traits> 的虛受保護成員函數) [編輯]
寫一個字符到放置區域,並推進下一位置指針
(std::basic_streambuf<CharT,Traits> 的公開成員函數) [編輯]
插入字符
(std::basic_ostream<CharT,Traits> 的公開成員函數) [編輯]