★ C++ ストリームクラス


ストリームクラスは C++ で提供される高機能な入出力クラスです。ここでは、マニピュレータ、入力関数、出力関数、状態テスト関数、ファイル入出力の各関数の説明を簡単にします。書式フラグ設定で更にきめ細かい処理が出来ますが、一般にエラーも生じやすくなるので、可能な限りマニピュレータを使うようにします。この HTML 文書自体あまり参考になるとは思えませんが、印刷して手元に置いておくのでしたら、LaTeX で書いたのもありますので、LaTeX が使える環境なら LaTeX 版をどうぞ。(LaTeX の方が印刷結果がきれいです。)

1.マニピュレータ

引数付きのマニピュレータは <iomanip> で定義されている。 それ以外は <iostream> をインクルードすれば使える。
◆ endl
改行文字 \n を付加して出力をフラッシュする。

◆ ends
NULL文字 \0 を付加して出力をフラッシュする。

◆ flush
出力をフラッシュする。

◆ boolalpha
bool の値を 1, 0 ではなく true, false で出力する。デフォルトでは 1, 0 で出力する。リセットするときは noboolalpha を使う。

◆ showbase
16進数のときの 0x や、8進数のときの 0 を出力する。デフォルトでは 0x や 0 は出力されない。リセットするときは noshowbase を使う。

◆ showpos
正の数のときの符号 (+) を明示的に出力する。デフォルトではマイナス (-) のときしか表示されない。リセットするときは noshowpos を使う。

◆ showpoint
浮動小数点表示のとき、末尾の 0 を表示する。デフォルトでは末尾の 0 は表示されない。リセットするときは noshowpoint を使う。

◆ skipws
入力のとき、空白を読み飛ばす。デフォルトでは読み飛ばさない。リセットするときは noskipws を使う。

◆ uppercase
16進数表示のときのアルファベットや、概数表示のときの e などを大文字で出力する。リセットするときは nouppercase を使う。

◆ left
フィールド幅が設定されているとき、値を左に寄せて、値の後に詰め文字を出力。(例: 123___ )

◆ right
フィールド幅が設定されているとき、値を右に寄せて、値の前に詰め文字を出力。(例:___123 )

◆ internal
フィールド幅が設定されているとき、符号を左、値を右に寄せて、符号と値の間に詰め文字を出力。(例: +__123 )

◆ dec
10進数で出力。デフォルトでセットされている。

◆ hex
16進数で出力。

◆ oct
8進数で出力。

◆ fixed
概数表示をしない。デフォルトでセットされている。(例: 123.457 )

◆ scientific
概数表示をする。(例: 1.23457e+03 )

◆ setbase(int base)
基数を設定する。(例:16進数 → setbase(16) )

◆ setfill(int f)
詰め文字を設定する。デフォルトは空白。(例: setfill('*') → ****123 )

◆ setprecision(int p)
浮動小数点表示のときの表示桁数をセットする。デフォルトは 6 。

◆ setw(int width)
フィールド幅をセットする。デフォルトは 0 。出力の度にリセットされるのでその都度セットし直さないといけない。

◆ setioflags(ios_base::fmtflags f)
書式設定フラグを手動でセットする。普通は他のマニピュレータで設定するのであまり使わない。(使わない方が安全)

2.入力の基本関数(basic_istream クラスで定義)

元々の定義では char 型ではなく、テンプレートのために Ch 型になっているが、ここでは char や int を使う。
◆ int gcount( )
最後に実行された未整形入力関数で読み込まれた文字数を返す。

◆ char get( )
一個の文字を読み込む。(本当は int らしいけど、意味は同じ。)

◆ basic_istream& get(char& c)
一個の文字を c に読み込む。(注: 参照渡し)

◆ basic_istream& get(char* buf, int size, char term)
文字列をストリームから buf に最大 size -1 文字読み込む。読み込むのは終端記号 term が現れるか、文字列が終わるまで。term を省略した場合は改行記号 \n がデフォルトでセットされる。読み込みが終わったときのストリームポインタは終端記号の上に残るので、次の読み込みは終端記号から始まる。従って、ループで get( ) を繰り返す場合は終端記号の処理をしないといけない。size 以前に終端記号が見つからなかった場合、文字列の終わりまで読み込まれ、failbit がセットされる。

◆ basic_istream& getline(char* buf, int size, char term)
文字列をストリームから buf に最大 size -1 文字読み込む。読み込むのは終端記号 term が現れるか、文字列が終わるまで。term を省略した場合は改行記号 \n がデフォルトでセットされる。終端記号は読み込まれたあとに破棄されるので、buf に終端記号は格納されない。読み込みが終わったときのストリームポインタは終端記号の後にセットされるので、次の読み込は終端記号の次の文字から始まる。size 以前に終端記号が見つからなかった場合、文字列の終わりまで読み込まれ、failbit がセットされる。

◆ basic_istream& ignore(int n, char term)
文字列をストリームから読み込むが、どこにも保存しない読み飛ばし用の関数。第一引数は読み飛ばす文字数で、第二引数はどこまで読み飛ばすかの終端記号を指定する。第二引数 term を省略した場合は EOF がデフォルトで終端記号としてセットされる。(文字列の場合は \0 まで)第一引数も省略した場合は一文字だけ読み飛ばす。終端記号を設定して読み飛ばした場合、ストリームポインタは getline( ) と同じように、終端記号の後にセットされる。

◆ basic_istream& read(char* buf, int len)
文字列をストリームから buf に len文字読み込む。読み込んだ後に \0 を付加しないので、バイナリ読み込み用に使う。\0 や終端記号に影響されない。

◆ pos_type tellg( )
現在の読み込み位置を返す。

◆ basic_istream& seekg(pos_type n)
読み込み位置を設定する。(絶対指定)

◆ basic_istream& seekg(off_type n, seekdir rel)
読み込み位置を設定する。(相対指定) seekdir は ios_base で定義されており beg (先頭)、cur(現在地)、end(末尾)が指定できる。rel から n だけ後にストリームポインタをセットする。

◆ basic_istream& putback(char c)
文字 c をバッファに戻す。

◆ basic_istream& unget( )
最後に読み込んだ文字をバッファに戻す。

◆ char peek( )
次に読み込まれる文字を覗く。文字はバッファから取り出されないので、次の読み込みには影響しない。

3.出力の基本関数(basic_ostream クラスで定義)

◆ basic_ostream& put(char c)
c を出力する。

◆ basic_ostream& write(const char* str, int n)
文字列 str から n 文字だけ出力する。

◆ pos_type tellp( )
入力関数の tellg( ) と同じ。(ただし出力)

◆ basic_ostream& seekp(pos_type n)
入力関数の seekg( ) と同じ。(ただし出力)

◆ basic_ostream& seekp(off_type n, seekdir rel)
入力関数の seekg( ) と同じ。(ただし出力)

4.ストリームの状態

ストリームの状態プロパティ(ios_base で定義)

iostate goodbit ストリームの状態は正常
iostate eofbit 終端に達した状態
iostate failbit (軽度の)失敗
iostate badbit (重度の)エラー

状態テスト関数(basic_ios で定義)

◆ bool good( )
goodbit のとき true を返す。

◆ bool eof( )
eofbit のとき true を返す。

◆ bool fail( )
failbit のとき true を返す。

◆ bool bad( )
badbit のとき true を返す。

◆ iostate rdstate( )
現在の状態プロパティを取得する。

◆ void clear(iostate s)
現在の状態をリセットして s をセット。引数省略時は goodbit をセット。

◆ void setstate(iostate s)
現在の状態に s を追加する。

5.ファイル入出力

ファイル入出力を行うときは <fstream> をインクルードする。ファイル入力とファイル出力では、コンストラクタがデフォルトでセットするオープンモード以外は同じである。ファイル入力は basic_ifstream で、ファイル出力は basic_ofstream でそれぞれ定義されている。
◆ explicts basic_ifstream(const char* filename, openmode mode)
ファイル入力ストリームのコンストラクタ。filename には開きたいファイル名、mode にはオープンモード(開き方)を指定する。mode を省略したときのデフォルトには ios_base::in がセットされる。filename まで省略した場合は open( ) を使ってファイルを手動で開かなくてはならない。また、手動で開いたファイルはデストラクタでは閉じないので、手動で閉じなくてはならない。

◆ explicts basic_ofstream(const char* filename, openmode mode)
入力と同じであるが、第二引数 mode を省略したときにデフォルトでセットされるオープンモードが ios_base::out | ios_base::trunc である。

◆ void open(const char* filename, openmode mode)
手動でファイルを開くときの関数。第二引数 mode を省略したときにデフォルトで設定されるオープンモードは basic_ifstream( ) やbasic_ofstream( ) と同じである。open( ) で開いたファイルはclose( ) を使って手動で閉じなくてはならない。

◆ void close( )
手動でファイルを閉じるときの関数。コンストラクタで開いたファイルは自動で閉じるが、明示的に close( ) しても問題はないし、ファイルの安全性が重要な場合は、速やかに閉じると良い。

◆ bool is_open( )
ファイルを開いているかどうかを調べる関数。開いていれば true を返す。

◆ オープンモード一覧(ios_base)
openmode app 追加モードで開く。
openmode ate ファイルの終端にシークする。(at end という意味)
openmode binary バイナリモードで開く。
openmode in 入力、読み込みモードで開く。
openmode out 出力、書き込みモードで開く。
openmode trunc ファイルサイズを 0 にする。(ファイルをクリア)