名稱空間
變體
操作

std::basic_streambuf<CharT,Traits>::overflow

來自 cppreference.com
< cpp‎ | io‎ | basic streambuf
 
 
 
 
protected:
virtual int_type overflow( int_type ch = Traits::eof() );

此函式的意圖是將字元從流緩衝區的放置區傳輸到關聯字元序列

形式上,此函式確保放置區中至少有容納一個字元的空間。基類版本總是失敗,而可能成功的實現只能在派生類中提供(參見實現要求)。標準庫提供了std::strstreambuf::overflow()(C++26 前)std::basic_stringbuf::overflow()std::basic_filebuf::overflow()

目錄

[編輯] 引數

ch - - 要儲存在放置區的字元

[編輯] 返回值

成功時返回不同於 Traits::eof() 的值。失敗時返回 Traits::eof() 或丟擲異常。

[編輯] 實現要求

此虛擬函式的每個重寫定義都必須遵守以下約束,否則行為是未定義的:

  • 函式的效果是消耗待處理序列中字元的某個初始子序列。待處理序列定義為以下序列的串聯:
    • 放置區(形式上,若 pbase() 為空,則為空序列,否則為從 pbase() 開始的 (pptr() - pbase()) 個字元)。
    • 字元 ch,或者如果 ch 是 EOF 則什麼都沒有(形式上,如果 Traits::eq_int_type(ch, Traits::eof()) 返回 true)。
  • 消耗後,更新放置區指標以儲存剩餘的字元(如果有)。形式上,設 r 為待處理序列中未被消耗的字元數:
    • 如果 r 非零,則設定 pbase()pptr() 以使以下所有條件都滿足:
      • pptr() - pbase() 等於 r
      • pbase() 開始的 r 個字元是關聯輸出流中尚未消耗的字元。
    • 如果 r 為零(待處理序列的所有字元都已被消耗),則 pbase() 被設定為空值,或者 pbase()pptr() 都被設定為相同的非空值。
  • 如果將某個字元附加到關聯輸出流失敗,或者無法根據上述規則建立 pbase()pptr(),則函式可能失敗。
  • 如果函式成功,則返回某個不同於 Traits::eof() 的值。通常,返回 ch 表示成功,除非 Traits::eq_int_type(ch, Traits::eof()) 返回 true,在這種情況下返回 Traits::not_eof(ch)
  • 如果函式失敗,則返回 Traits::eof() 或丟擲異常。

[編輯] 注意

sputc()sputn() 在發生溢位時(pptr() == nullptrpptr() >= epptr())呼叫此函式。

[編輯] 示例

#include <array>
#include <cstddef>
#include <iostream>
 
// Buffer for std::ostream implemented by std::array
template<std::size_t size, class CharT = char>
struct ArrayedStreamBuffer : std::basic_streambuf<CharT>
{
    using Base = std::basic_streambuf<CharT>;
    using char_type = typename Base::char_type;
    using int_type = typename Base::int_type;
 
    ArrayedStreamBuffer()
    {
        // put area pointers to work with 'buffer'
        Base::setp(buffer.data(), buffer.data() + size);
    }
 
    int_type overflow(int_type ch) 
    {
        std::cout << "overflow\n";
        return Base::overflow(ch);
    }
 
    void print_buffer()
    {
        for (char_type i : buffer)
        {
            if (i == 0)
                std::cout << "\\0";
            else
                std::cout << i;
            std::cout << ' ';
        }
        std::cout << '\n';
    }
 
private:
    std::array<char_type, size> buffer{}; // value-initialize buffer
};
 
int main()
{
    ArrayedStreamBuffer<10> streambuf;
    std::ostream stream(&streambuf);
 
    stream << "hello";
    streambuf.print_buffer();
    if (stream.good())
        std::cout << "stream is good\n";
 
    stream << "world";
    streambuf.print_buffer();
    if (stream.good())
        std::cout << "stream is good\n";
 
    stream << "!";
    streambuf.print_buffer();
    if (!stream.good())
        std::cout << "stream is not good\n";
}

輸出

h e l l o \0 \0 \0 \0 \0
stream is good
h e l l o w o r l d 
stream is good
overflow
h e l l o w o r l d 
stream is not good

[編輯] 參見

[虛擬函式]
從關聯輸入序列中讀取字元到獲取區並推進下一個指標
(虛保護成員函式) [編輯]
[虛擬函式]
從關聯輸入序列中讀取字元到獲取區
(虛保護成員函式) [編輯]
[虛擬函式]
從放置區向關聯檔案寫入字元
std::basic_filebuf<CharT,Traits> 的虛保護成員函式) [編輯]
[虛擬函式]
將一個字元附加到輸出序列
std::basic_stringbuf<CharT,Traits,Allocator> 的虛保護成員函式) [編輯]
[虛擬函式]
向輸出序列追加一個字元,如果緩衝區是動態且未凍結的,則可能重新分配或初始分配緩衝區
std::strstreambuf 的虛保護成員函式) [編輯]