最終更新日時:
が更新

履歴 編集

function
<istream>

std::basic_istream::operator>>

namespace std {
  template<class CharT, class Traits = char_traits<CharT>>
  class basic_istream : virtual public basic_ios<CharT, Traits> {
    // マニピュレータ
    // 3つとも関数へのポインタを引数に取る。
    basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>& (*pf)(basic_istream<CharT, Traits>&));
    basic_istream<CharT, Traits>& operator>>(basic_ios<CharT, Traits>& (*pf)(basic_ios<CharT, Traits>&));
    basic_istream<CharT, Traits>& operator>>(ios_base& (*pf)(ios_base&));

    // bool値・数値・ポインタ
    basic_istream<CharT, Traits>& operator>>(bool& n);
    basic_istream<CharT, Traits>& operator>>(short& n);
    basic_istream<CharT, Traits>& operator>>(unsigned short& n);
    basic_istream<CharT, Traits>& operator>>(int& n);
    basic_istream<CharT, Traits>& operator>>(unsigned int& n);
    basic_istream<CharT, Traits>& operator>>(long& n);
    basic_istream<CharT, Traits>& operator>>(unsigned long& n);
    basic_istream<CharT, Traits>& operator>>(long long& n); // C++11
    basic_istream<CharT, Traits>& operator>>(unsigned long long& n); // C++11
    basic_istream<CharT, Traits>& operator>>(float& f);
    basic_istream<CharT, Traits>& operator>>(double& f);
    basic_istream<CharT, Traits>& operator>>(long double& f);
    basic_istream<CharT, Traits>& operator>>(void*& p);

    // ストリームバッファ
    basic_istream<CharT, Traits>& operator>>(basic_streambuf<char_type, Traits>* sb);

    ……
  };

  // 文字
  template<class CharT, class Traits>
  basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>& is, CharT& c);
  template<class Traits>
  basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, unsigned char& c);
  template<class Traits>
  basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, signed char& c);

  // 文字列
  template<class CharT, class Traits>
  basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>& is, CharT* c);
  template<class Traits>
  basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, unsigned char* c);
  template<class Traits>
  basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, signed char* c);

  // ストリームへの右辺値参照 (C++11)
  template<class CharT, class Traits, class T>
  basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>&& is, T& x);
}

概要

ストリームからの入力またはマニピュレータの実行を行う。

  • マニピュレータを実行するオーバーロードそれ自体は、書式化入力関数・非書式化入力関数いずれにも該当しない。
    • マニピュレータが書式化入力関数・非書式化入力関数であるということはあり得る(例: ws)。
  • 数値型(boolも含む)とvoid*に対するオーバーロードは、書式化入力関数である。
  • basic_streambufに対するオーバーロードは、非書式化入力関数である。
  • 文字に対するオーバーロードは、書式化入力関数である。
  • 文字列に対するオーバーロードは、書式化入力関数である。

文字列入力における注意

ここで説明するオーバーロード(CharT*unsigned char*signed char*)で文字列への入力を行う場合、必ずマニピュレータsetwで配列の要素数を指定すること(この記事の下方にある例(文字列)を参照)。 さもなくば、バッファオーバーフローの可能性があり、大変危険である。

あるいは、これらの代わりにbasic_string (std::stringstd::wstringなど)に対して>>演算子を使用することでも、この危険を回避できる。 参考: >>演算子 (basic_string)

効果

マニピュレータ

  1. pf(*this)を呼び出す。

bool値・数値・ポインタ

  1. sentryオブジェクトを構築する。sentryオブジェクトが失敗を示した場合、何もしない。
  2. num_get::getを使用して入力のパース・数値への変換を行う。
    • ただし、intshortの場合は、longを実引数に取るものを使用する。結果がintshortそれぞれの範囲外の値になった場合、failbitを追加する。
  3. num_get::getから得られたiostate値を実引数にしてsetstate関数を呼び出す。

ストリームバッファ

ストリームからの入力を別のストリームバッファに出力する。

  1. 仮引数sbがヌルポインタの場合、setstate(failbit)を呼び出して終了する。
  2. sentryオブジェクトを構築する。sentryオブジェクトが失敗を示した場合、何もしない。
  3. 以下のいずれかを満たすまで、this内のストリームバッファから文字を入力してsbへ出力する。
    • EOFに達した。
    • 出力処理に失敗した(この場合、失敗したときの文字は入力側のストリームバッファに戻される)。
    • 例外が発生した。

入力がなされなかった場合、setstate(failbit)を呼び出す。

文字

文字型CharTへの参照を実引数として受け取る。 ただし、CharTがcharの場合に限りunsigned charおよびsigned charへの参照も受け付ける。

  1. sentryオブジェクトを構築する。sentryオブジェクトが失敗を示した場合、何もしない。
  2. ストリームバッファから1文字取り出し、仮引数cに書き込む。

入力がなされなかった場合、setstate(failbit)を呼び出す。

文字列

文字型CharTの配列の要素を指し示すポインタを実引数として受け取る。 ただし、CharTcharの場合に限り、unsigned charおよびsigned charの配列の要素を指し示すポインタも受け付ける。

  1. sentryオブジェクトを構築する。sentryオブジェクトが失敗を示した場合、何もしない。
  2. ストリームバッファから文字を読み取り、仮引数sが指し示す配列の要素に順に書き込む。これを以下いずれかを満たすまで繰り返す。
    • 最大文字数より1文字少ない文字数だけ書き込んだ。最大文字数は以下のようにして決まる。
      • width()が1以上であれば、その値を最大文字数とする。
      • width()が0以下であれば、ストリームのCharT型においてあり得る最大の配列の要素数とする。
    • EOFに達した。
    • 空白文字に達した。空白文字の判定にはストリームに設定されているロケールが考慮される。
  3. sの末尾にヌル文字CharT()を書き込む。
  4. width(0)を呼び出す。

1文字も入力がなされなかった場合、setstate(failbit)を呼び出す。

width()の値を変更するには、setwマニピュレータまたはwidth()メンバ関数を使用する。

ストリームへの右辺値参照 (C++11)

is >> xを実行する。このオーバーロードは、一時オブジェクトなどに対して>>演算子を利用可能にするためのものである。

戻り値

*this

例(数値)

#include <iostream>

int main() {
  int x;
  // 好きな整数を入力してください
  if (std::cin >> x) {
    std::cout << x << "が入力されました。" << std::endl;
  }
}

入力

1

出力

1が入力されました。

例(文字列)

#include <iostream>
#include <iomanip>

int main() {
  char s[8];
  // 好きな文字を入力してください
  if (std::cin >> std::setw(sizeof (s)) >> s) {
    std::cout << s << "が入力されました。" << std::endl;
  }
}

入力

Kerberos

出力

Kerberoが入力されました。

実装例

TBD

バージョン

言語

  • C++98
  • C++11: long longunsigned long long、ストリームへの右辺値参照を実引数として受け取るものが追加された

関連項目

参照