protected:
virtual int_type overflow(int_type c = traits::eof()); // (1) C++03
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);
ここで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();
}
出力例
overflow
overflow
バージョン
言語
- C++98