std::basic_filebuf<CharT,Traits>::overflow
From cppreference.com
< cpp | io | basic filebuf
| protected: virtual int_type overflow( int_type ch = Traits::eof() ); |
||
送信領域(バッファ)のデータを関連付けられた文字シーケンス(ファイル)に書き込みます。
基底クラスのバージョン std::basic_streambuf::overflow() と同様に動作しますが、「文字を消費する」という動作の定義は以下のようになります。
1) まず、組み込まれたロケールの std::codecvt::out を使用して、文字を外部(マルチバイト表現の可能性あり)の表現に変換し、一時バッファに格納します。次のようになります(XSIZE は未指定のバッファサイズです)。
const std::codecvt<CharT, char, typename Traits::state_type>& a_codecvt = std::use_facet<std::codecvt<CharT, char, typename Traits::state_type>>(getloc()); typename Traits::state_type state; CharT* end; char xbuf[XSIZE]; char* xbuf_end; std::codecvt_base::result r = a_codecvt.out(state, pbase(), pptr(), end, xbuf, xbuf + XSIZE, xbuf_end);
2) 次に、完全に変換された文字すべてをバッファからファイルに書き込みます。形式的には、r の値に基づいて、以下の手順を実行します。
| r | 操作 |
|---|---|
| std::codecvt_base::ok | 変換された文字をファイルに、[xbuf, xbuf_end) から出力します。出力に失敗した場合は失敗とします。この時点で、もし pbase() != pptr() かつ pbase() == end が両方 true であった場合(これは xbuf が1つの外部文字に対しても十分な大きさでないことを意味します)、XSIZE を増やし、最初からやり直します。 |
| std::codecvt_base::partial | 変換された外部文字をファイルに、[xbuf, xbuf_end) から出力します。そして、未変換の内部文字が残っている場合、[end, pptr()) の範囲で再度処理を試みます。出力に失敗した場合は、やり直さずに失敗とします。 |
| std::codecvt_base::noconv | 文字をファイルに、[pbase(), pptr()) から出力します。 |
| std::codecvt_base::error | 失敗します。 |
関連付けられたファイルが開かれていない場合(is_open() が false を返す場合)、出力は常に失敗します。
|
3) 観測可能なチェックポイントを確立します。
|
(C++26以降) |
目次 |
[編集] パラメータ
| 文字 | - | 出力領域に格納する文字 |
[編集] 戻り値
Traits::not_eof(ch) は成功を示すために、Traits::eof() は失敗を示すために返されます。
[編集] 備考
a_codecvt.always_noconv() が true を返す場合、a_codecvt.out() の呼び出しはスキップされることがあります。
[編集] 例
| このセクションは未完成です 理由: 例がありません |
[編集] 関連項目
| [virtual] |
関連付けられた出力シーケンスに、配置領域から文字を書き込む ( std::basic_streambuf<CharT,Traits> の仮想 protected メンバ関数) |
| [virtual] |
関連付けられたファイルから読み込みます。 (virtual protected member function) |