- fstream[meta header]
- std[meta namespace]
- basic_filebuf[meta class]
- function[meta id-type]
protected:
virtual int_type overflow(int_type c = traits::eof()); // (1) C++98
int_type overflow(int_type c = traits::eof()) override; // (1) C++17出力部分列の領域を消費し切った際に、蓄えられた文字をファイルへ書き出す。
このメンバ関数はprotectedであり、sputc()などのpublicメンバ関数を通して間接的に呼び出される。
basic_streambuf::overflow(c)の規定に従う。ただしbasic_filebufでは「文字を消費する」動作が、まず以下のように変換を行ったうえで実施される。
charT* b = pbase();
charT* p = pptr();
const charT* end;
char xbuf[XSIZE];
char* xbuf_end;
codecvt_base::result r =
a_codecvt.out(state, b, p, end, xbuf, xbuf+XSIZE, xbuf_end);- pbase()[link /reference/streambuf/basic_streambuf/pbase.md]
- pptr()[link /reference/streambuf/basic_streambuf/pptr.md]
- codecvt_base::result[link /reference/locale/codecvt_base.md]
- a_codecvt.out[link /reference/locale/codecvt/out.md]
ここでa_codecvtは、このストリームバッファに設定されているロケールのcodecvtファセットである。変換結果rに応じて、以下のように動作する。
r == codecvt_base::errorの場合、失敗するr == codecvt_base::noconvの場合、bからpの直前までの文字を出力するr == codecvt_base::partialの場合、xbufからxbuf_endまでの文字をファイルへ出力し、endからpまでの文字を使って繰り返す。出力に失敗した場合は(繰り返さずに)失敗する- それ以外の場合、
xbufからxbuf_endまでを出力し、出力に失敗したら失敗する。この時点でb != pかつb == endである(xbufの領域が足りない)場合は、XSIZEを増やして最初から繰り返す
その後、観測可能なチェックポイントを設定する。
- 成功した場合、
Traits::not_eof(c) - 失敗した場合、
Traits::eof()
is_open()== falseである場合、この関数は常に失敗する。
#include <iostream>
#include <fstream>
// basic_filebufを継承して、protectedなoverflowの呼び出しを観測する
struct my_filebuf : std::filebuf {
protected:
int_type overflow(int_type c) override
{
std::cout << "overflow" << std::endl;
return std::filebuf::overflow(c);
}
};
int main()
{
my_filebuf buf;
buf.open("test.txt", std::ios_base::out);
// 出力領域を持たない状態で書き込むため、overflow()が呼ばれる
buf.sputc('A');
// 書き出しのために、closeからもoverflow()が呼ばれる
buf.close();
}- std::filebuf[link /reference/fstream/basic_filebuf.md]
- overflow[color ff0000]
- buf.open[link open.md]
- buf.close()[link close.md]
- buf.sputc[link /reference/streambuf/basic_streambuf/sputc.md]
overflow
overflow
- C++98