• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <istream>

    std::operator>> (非メンバ関数)

    namespace std {
      // 文字
      template<class CharT, class Traits>
      basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>& is, CharT& c);        // (1) C++03
      template<class Traits>
      basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, unsigned char& c); // (2) C++03
      template<class Traits>
      basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, signed char& c);   // (3) C++03
    
      // 文字列
      template<class CharT, class Traits>
      basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>& is, CharT* c);             // (4) C++03
      template<class CharT, class Traits, std::size_t N>
      basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>& is, CharT (&s)[N]);        // (4) C++20
      template<class Traits>
      basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, unsigned char* c);      // (5) C++03
      template<class Traits, std::size_t N>
      basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, unsigned char (&s)[N]); // (5) C++20
      template<class Traits>
      basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, signed char* c);        // (6) C++03
      template<class Traits, std::size_t N>
      basic_istream<char, Traits>& operator>>(basic_istream<CharT, Traits>& is, signed char (&s)[N]);   // (6) C++20
    
      // 右辺値参照ストリームからの入力
      template<class CharT, class Traits, class T>
      basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>&& is, T& x);           // (7) C++11
    }
    

    概要

    ストリームからの入力を行う。

    • 文字、および、文字列に対するオーバーロードは、書式化入力関数である。
    • 右辺値参照ストリームからの入力に対するオーバーロードそれ自体は、書式化入力関数・非書式化入力関数いずれにも該当しない。
      • 実際に実行される入力が書式化入力関数・非書式化入力関数であるということはあり得る。

    文字列入力における注意

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

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

    効果

    文字

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

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

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

    文字列

    • C++03 : 文字型CharTの配列の要素を指し示すポインタを実引数として受け取る
      • ただし、CharTcharの場合に限り、unsigned charおよびsigned charの配列の要素を指し示すポインタも受け付ける
    • C++20 : 文字型CharTの要素数が判明している配列への参照を受け取る

    • sentryオブジェクトを構築する。sentryオブジェクト構築が失敗を示した場合、何もしない。

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

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

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

    右辺値参照ストリームからの入力 (C++11)

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

    戻り値

    *this

    例(文字列)

    #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: 右辺値参照ストリームを演算子の左辺として受け取るものが追加された

    関連項目

    参照