C++ では、入出力をストリームという抽象で扱う。 ストリームは「順番に読み書きできるバイト列」であり、キーボード入力・画面出力・ファイル入出力などを共通の考え方で扱える。
入力ストリーム
入力ストリームは、外部から届いたデータをプログラムが順に取り出すためのストリーム。
C++ では std::istream が代表的な入力ストリームの型であり、標準入力の std::cin やファイル入力の std::ifstream がこれに属する。
値の取り出しには、主に抽出演算子 >> を使う。
出力ストリーム
出力ストリームは、プログラムが生成したデータを外部へ順に送り出すためのストリーム。
C++ では std::ostream が代表的な出力ストリームの型であり、標準出力の std::cout、標準エラー出力の std::cerr と std::clog がこれに属する。
値の書き込みには、主に挿入演算子 << を使う。
iostream と ios
std::istream入力ストリームの基本クラス。std::ostream出力ストリームの基本クラス。std::iostream入出力の両方を扱えるストリームの基本クラス。std::ios/std::ios_baseストリームの状態や書式設定を支える共通機能を提供する。
std::boolalpha や std::hex のような書式設定、failbit などの状態フラグは、この共通基盤に属する。
つまり std::istream や std::ostream は、読み書きの機能に加えて、std::ios 系が持つ「現在の書式設定」と「現在の状態フラグ」も引き継いでいる。
たとえば次のようなものは std::ios 系の管理対象として考えると整理しやすい。
- 書式設定
std::boolalpha、std::hex、std::fixedなど - 状態フラグ
goodbit、failbit、badbit、eofbit
そのため、出力では「設定が残る」、入力では「失敗状態を持つ」という話が同じ基盤の上で起きている。