Skip to content

Latest commit

 

History

History
144 lines (102 loc) · 8.28 KB

basic_istream.md

File metadata and controls

144 lines (102 loc) · 8.28 KB

basic_istream

  • istream[meta header]
  • std[meta namespace]
  • class template[meta id-type]
namespace std {
  template<class CharT, class Traits = char_traits<CharT>>
  class basic_istream : virtual public basic_ios<CharT, Traits> { …… };

  using istream  = basic_istream<char>;
  using wistream = basic_istream<wchar_t>;
}
  • basic_ios[link ../ios/basic_ios.md]
  • char_traits[link ../string/char_traits.md]

概要

basic_istreamは、入力ストリームを表現するクラスである。 すなわち、rdbuf()が指し示すストリームバッファオブジェクトに対する読み取り操作を提供する。

各種の入力関数——特に>>演算子——がこのクラスのメンバ関数・非メンバ関数として定義されている。 このため、ユーザーコードで入力処理を実装する際には、basic_istream、あるいはそれに対する別名であるistreamwistreamなどの型への参照を実引数として受け取るようにすると良い。

テンプレートパラメータとして文字型を受け取るようになっており、使用を容易にするため、以下のパラメータ設定済みエイリアスが定義されている。 このエイリアスは<istream>ヘッダと<iosfwd>ヘッダで定義されている。

エイリアス 説明 対応バージョン
istream char型。ASCII、UTF-8等のマルチバイト文字列や、バイナリデータとして使用する。
wistream wchar_t型。ワイド文字列として使用する。

書式化入力関数と非書式化入力関数

basic_istreamでの入力操作は、書式化入力関数と非書式化入力関数の2種類に分類される。

書式化入力関数

書式化入力関数は、そのほとんどがストリームバッファから抽出した文字の並びから目的のオブジェクトに変換する処理を伴う入力処理である。 以下の共通した機能を持つ。

  • skipwsフラグが設定されている場合、入力処理開始時に空白文字を読み飛ばす処理が挿入される。
  • オブジェクトへの変換処理が失敗した場合、setstate(ios_base::failbit)が呼び出される。

>>演算子での入力処理の多くは書式化入力関数である。

非書式化入力関数

非書式化入力関数は、ストリームバッファから抽出した文字の並びをそのまま呼び出し元に引き渡す入力処理である。 また、ストリームバッファからの読み取りを伴わない入力操作も便宜上こちらに分類される。

非書式化関数で入力した文字数はgcountメンバ関数で取得できる。

書式化入力関数と非書式化入力関数の効果

注意:書式化入力関数と非書式化入力関数すべてについて、「効果」の項目は以下の処理を前提として記載している。

書式化入力関数・非書式化入力関数は、入力処理に先立ってsentryオブジェクトを構築し、関数から脱出する前に破棄する。

  • 書式化入力関数は、sentryコンストラクタの2番目の仮引数noskipwsfalseを渡す。
  • 非書式化入力関数は、sentryコンストラクタの2番目の仮引数noskipwstrueを渡す。

構築したsentryオブジェクトがexplicit operator bool関数でtrueに変換できる場合のみ、実際の入力処理(各関数の「効果」として記載した処理)が実行される。

関数内部で例外が送出された場合、ios_base::badbitを設定する。 そして、(exceptions() & badbit) != 0であれば例外を再送出する。

メンバ

基底クラスであるios_basebasic_iosも参照のこと。

名前 説明 対応バージョン
sentry 入力操作の前処理・後処理

構築・破棄

名前 説明 対応バージョン
(constructor) コンストラクタ
(destructor) デストラクタ
operator= ムーブ代入 C++11
swap 値の交換 C++11
  • コピーコンストラクタとコピー代入演算子はdelete定義されている。
  • ムーブコンストラクタ・ムーブ代入演算子とswapはprotectedで定義されている。

入力処理

名前 説明 対応バージョン
operator>> 書式化入力・マニピュレータの実行
get 文字・文字列の入力
getline 1行の文字列の入力
peek 次の入力文字を確認する
read 指定した数ちょうどの文字の入力
readsome 指定した数までの文字の入力
ignore 入力文字を読み捨てる

>>演算子のほとんどは書式化入力関数である。 その他のメンバ関数は非書式化入力関数である。

読み戻し

名前 説明 対応バージョン
putback 任意の文字を1文字を入力ストリームに戻す
unget 最後に読み取った1文字を入力ストリームに戻す

これらは非書式化入力関数である。

シーク

名前 説明 対応バージョン
tellg 現在の読み取り位置を取得する
seekg 読み取り位置を移動する

これらは非書式化入力関数である。

入力処理その他

名前 説明 対応バージョン
gcount 最後に実行した非書式化入力関数での入力文字数を取得する
sync ストリームバッファの同期

gcountは書式化入力関数・非書式化入力関数いずれでもない。 syncは非書式化入力関数である。

非メンバ関数

名前 説明 対応バージョン
operator>> 文字・文字列の書式化入力、および、右辺値ストリームからの入力

参照