C++ では、入出力をストリームという抽象で扱う。 ストリームは「順番に読み書きできるバイト列」であり、キーボード入力・画面出力・ファイル入出力などを共通の考え方で扱える。

入力ストリーム

入力ストリームは、外部から届いたデータをプログラムが順に取り出すためのストリーム。 C++ では std::istream が代表的な入力ストリームの型であり、標準入力の std::cin やファイル入力の std::ifstream がこれに属する。

値の取り出しには、主に抽出演算子 >> を使う。

出力ストリーム

出力ストリームは、プログラムが生成したデータを外部へ順に送り出すためのストリーム。 C++ では std::ostream が代表的な出力ストリームの型であり、標準出力の std::cout、標準エラー出力の std::cerrstd::clog がこれに属する。

値の書き込みには、主に挿入演算子 << を使う。

iostream と ios

  • std::istream 入力ストリームの基本クラス。
  • std::ostream 出力ストリームの基本クラス。
  • std::iostream 入出力の両方を扱えるストリームの基本クラス。
  • std::ios / std::ios_base ストリームの状態や書式設定を支える共通機能を提供する。

std::boolalphastd::hex のような書式設定、failbit などの状態フラグは、この共通基盤に属する。 つまり std::istreamstd::ostream は、読み書きの機能に加えて、std::ios 系が持つ「現在の書式設定」と「現在の状態フラグ」も引き継いでいる。

たとえば次のようなものは std::ios 系の管理対象として考えると整理しやすい。

  • 書式設定 std::boolalphastd::hexstd::fixed など
  • 状態フラグ goodbitfailbitbadbiteofbit

そのため、出力では「設定が残る」、入力では「失敗状態を持つ」という話が同じ基盤の上で起きている。

関連

参考