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() 或丟擲異常。
[編輯] 實現要求
此虛擬函式的每個重寫定義都必須遵守以下約束,否則行為是未定義的:
- 函式的效果是消耗待處理序列中字元的某個初始子序列。待處理序列定義為以下序列的串聯:
- 消耗後,更新放置區指標以儲存剩餘的字元(如果有)。形式上,設 r 為待處理序列中未被消耗的字元數:
- 如果將某個字元附加到關聯輸出流失敗,或者無法根據上述規則建立 pbase() 和 pptr(),則函式可能失敗。
- 如果函式成功,則返回某個不同於 Traits::eof() 的值。通常,返回 ch 表示成功,除非 Traits::eq_int_type(ch, Traits::eof()) 返回 true,在這種情況下返回 Traits::not_eof(ch)。
- 如果函式失敗,則返回 Traits::eof() 或丟擲異常。
[編輯] 注意
sputc() 和 sputn() 在發生溢位時(pptr() == nullptr 或 pptr() >= 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 的虛保護成員函式) |