最終更新日時:
が更新

履歴 編集

function
<fstream>

std::basic_filebuf::pbackfail

protected:
  virtual int_type pbackfail(int_type c = traits::eof());  // (1) C++03
  int_type pbackfail(int_type c = traits::eof()) override; // (1) C++17

概要

1文字を入力列に戻す。

このメンバ関数はprotectedであり、sputbackc()sungetc()を通して間接的に呼び出される。

効果

可能であれば、cが指定する文字を入力シーケンスへ戻す。以下の3つのいずれかの方法で行われる。

  • Traits::eq_int_type(c,Traits::eof())falseを返し、この関数が戻し位置(putback position)を利用可能にでき、かつTraits::eq(Traits::to_char_type(c),gptr()[-1])trueを返す場合、入力シーケンスの次ポインタgptr()をデクリメントする
  • Traits::eq_int_type(c,Traits::eof())falseを返し、この関数が戻し位置を利用可能にでき、かつ戻し位置への代入が許される場合、入力シーケンスの次ポインタをデクリメントし、その位置にcを格納する
  • Traits::eq_int_type(c,Traits::eof())trueを返し、かつ入力シーケンスに戻し位置があるか、この関数が戻し位置を利用可能にできる場合、入力シーケンスの次ポインタgptr()をデクリメントする

複数の方法で成功しうる場合、どの方法が選択されるかは未規定である。

戻り値

  • 上記1番目・2番目の方法で成功した場合、c
  • 上記3番目の方法で成功した場合、Traits::not_eof(c)
  • 失敗した場合、Traits::eof()

備考

is_open()== falseである場合、この関数は常に失敗する。

この関数は、文字を入力シーケンスへ直接戻すわけではない。また、この関数の呼び出しによって利用可能な戻し位置の数が変化することがある。

#include <iostream>
#include <fstream>

// basic_filebufを継承して、protectedなpbackfailの呼び出しを観測する
struct my_filebuf : std::filebuf {
protected:
  int_type pbackfail(int_type c) override
  {
    std::cout << "pbackfail" << std::endl;
    return std::filebuf::pbackfail(c);
  }
};

int main()
{
  {
    std::filebuf out;
    out.open("test.txt", std::ios_base::out);
    out.sputn("AB", 2);
  }

  my_filebuf buf;
  buf.open("test.txt", std::ios_base::in);

  // 1文字も読み取っていない状態で戻そうとするため、pbackfail()が呼ばれて失敗する
  std::cout << (buf.sungetc() == std::filebuf::traits_type::eof()) << std::endl;
}

出力

pbackfail
1

バージョン

言語

  • C++98

関連項目