std::FILE
ヘッダ <cstdio> で定義
|
||
typedef /* implementation-defined */ FILE; |
||
各 std::FILE
オブジェクトはCストリームを表します。
C 標準 (C++ 標準に参照される) は std::FILE
が完全オブジェクト型かどうかを規定していません。 有効な std::FILE
をコピーすることは可能かもしれませんが、そのようなコピーのアドレスを入出力関数で使用することは未規定な動作です。 言い換えれば、 std::FILE
は意味論的にコピー不可能かもしれません。
入出力ストリームは書式なしおよび書式付きの入力および出力の両方で使うことができます。更に、入出力をハンドルする関数はロケールの影響を受けることができて、ワイド文字とマルチバイト文字の変換を必要に応じて行います。
目次 |
[編集] ストリーム状態
デバイスにアクセスするために必要なシステム固有の情報 (例えば POSIX のファイル記述子など) に加えて、各 std::FILE
オブジェクトは直接的または間接的に以下の情報を保持しています。
- 文字幅: 未設定、ナロー、ワイド
- ワイド文字とマルチバイト文字とのパース状態 (std::mbstate_t 型のオブジェクト)
- バッファリング状態: バッファリングなし、行バッファリング、完全バッファリング
- バッファ: ユーザから提供される外部のバッファに置き換えることができます
- 入出力モード: 入力、出力、更新
- バイナリモードとテキストモードの区別
- ファイル終端状態指示子
- エラー状態指示子
- std::fpos_t 型のオブジェクトとしてアクセス可能なファイル位置指示子。 ワイドストリームではパース状態を含みます
- (C++17) 複数のスレッドで読み書きする場合のデータ競合を避けるために使用する再入可能なロック
[編集] ナロー指向とワイド指向
新たに開かれたストリームは無指向です。 std::fwide または任意の入出力関数の最初の呼び出しにより指向が確立されます。 ワイド入出力関数はストリームをワイド指向に設定し、ナロー入出力関数はストリームをナロー指向に設定します。 一度設定されると、指向は std::freopen のみで変更できます。 ナロー入出力関数をワイド指向のストリームに対して呼ぶことはできませんし、ワイド入出力関数をナロー指向のストリームに対して呼ぶことはできません。 ワイド入出力関数はストリームに記述されている変換状態で、 std::mbrtowc または std::wcrtomb を使用したかのようにワイド文字とマルチバイト文字を変換します。 プログラム内で有効なマルチバイト文字列と異なり、ファイル内のマルチバイト文字シーケンスにはヌル文字が埋め込まれる場合があり、初期シフト状態で開始したり初期シフト状態で終了したりする必要はありません。
ワイド指向を持つストリームの変換状態は、ストリームの指向を設定したときにインストールされたCロケールに確立されます。
[編集] バイナリモードとテキストモード
テキストストリームは行に構成されることができる順序付きの文字の並びです。 行はゼロ個以上の文字と行末文字 '\n' (「改行」) に構成されることができます。 最終行に行末文字 '\n' が必要かどうかは処理系定義です。 更に文字はOSのテキスト表現の規約に沿うよう、入出力時に追加されたり変更されたり削除されたりする場合があります (特に Windows OS のCストリームでは出力時に '\n' が '\r\n' に変換され、入力時に '\r\n' が '\n' に変換されます)。
テキストストリームからのデータの読み取りは、以下のすべての条件を満たす場合に限り、以前にそのストリームに書き込んだデータと等しいことが保証されます。
- データは印刷文字および制御文字 '\t' および/または '\n' のみで構成されなければなりません (特に Windows OS では文字 '\0x1A' は入力を終端させます)
- '\n' 文字の直前に空白文字があってはいけません (そういう空白文字は後に出力を入力として読み取り時に消える場合があります)
- 最後の文字は '\n' でなければなりません
バイナリストリームは内部データを透過的に記録できる順序付きの文字の並びです。 バイナリストリームから読み取ったデータは、以前にそのストリームに書き出したデータと常に等しくなるが、処理系はストリームの最後にヌル文字をいくつか追加することが許されています。 ワイドバイナリストリームは初期シフト状態で終わる必要はありません。
[編集] ノート
POSIX は、ストリームの指向がワイドになった時点で、現在設定されているCロケールの LC_CTYPE
ファセットをストリームオブジェクト内に格納することを明示的に要求しています。 POSIX は、この LC_CTYPE
ファセットを指向が変わるまで、以降の std::setlocale の呼び出しにかからわず、そのストリームの将来のすべての入出力に使用することを要求しています。
テキストの各行は本質的に対人可読なデータに構成されると意図されます。 POSIX の処理系はテキストストリームとバイナリストリームを区別しません ('\n' や他のいかなる文字にも特別なマッピングはありません)。
[編集] 関連項目
生のデバイスを抽象化します (クラステンプレート) | |
生のファイルデバイスを実装します (クラステンプレート) | |
FILE の C言語リファレンス
|