Skip to content

Latest commit

 

History

History
101 lines (79 loc) · 3.51 KB

File metadata and controls

101 lines (79 loc) · 3.51 KB

overflow

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

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

戻り値

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

関連項目