最終更新日時:
が更新

履歴 編集

function
<fstream>

std::basic_filebuf::overflow

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を増やして最初から繰り返す

その後、観測可能なチェックポイントを設定する。

戻り値

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

関連項目