std::FILE
| ヘッダ <cstdio>で定義 |
||
| typedef /* 不明 */ FILE; |
||
各std::FILEオブジェクトはCストリームを表します。
C++標準で参照されているC標準では、std::FILEが完全なオブジェクト型であるかどうかは規定されていません。有効なstd::FILEをコピーできる場合もありますが、そのようなコピーへのポインタをI/O関数の引数として使用すると、未定義の動作が発生します。言い換えれば、std::FILEは意味論的にコピー不可能である可能性があります。
I/Oストリームは、非フォーマットおよびフォーマットされた入出力の両方に使用できます。さらに、入出力を処理する関数はロケールに依存する場合もあり、必要に応じてワイド/マルチバイト変換が実行されます。
目次 |
[編集] ストリームの状態
デバイスへのアクセスに必要なシステム固有の情報(例:POSIXファイルディスクリプタ)に加えて、各std::FILEオブジェクトは、直接的または間接的に以下のものを保持します。
- 文字幅:未設定、ナロー、またはワイド。
- マルチバイト文字とワイド文字間の変換のための解析状態(std::mbstate_t型のオブジェクト)
- バッファリング状態:バッファリングなし、ラインバッファリング、フルバッファリング。
- バッファ。これは、外部のユーザー提供バッファに置き換えることができます。
- I/Oモード:入力、出力、または更新(入力と出力の両方)。
- バイナリ/テキストモードインジケーター。
- ファイル終端ステータスインジケーター。
- エラーステータスインジケーター。
- ファイル位置インジケーター。std::fpos_t型のオブジェクトとしてアクセス可能で、ワイドストリームの場合、解析状態を含みます。
- (C++17) 複数のスレッドがストリームの読み取り、書き込み、配置、または位置のクエリを行う際にデータ競合を防ぐために使用される再入可能ロック。
[編集] ナローおよびワイドオリエンテーション
新しく開かれたストリームにはオリエンテーションがありません。最初にstd::fwideまたは任意のI/O関数を呼び出すと、オリエンテーションが確立されます。ワイドI/O関数はストリームをワイドオリエンテーションにし、ナローI/O関数はストリームをナローオリエンテーションにします。一度設定されると、オリエンテーションはstd::freopenでのみ変更できます。ナローI/O関数はワイドオリエンテーションのストリームでは呼び出せません。ワイドI/O関数はナローオリエンテーションのストリームでは呼び出せません。ワイドI/O関数は、ストリームによって記述された変換状態を使用して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ファセットが、ストリームのオリエンテーションがワイドになった瞬間にFILEオブジェクト内に格納されることを明示的に要求しています。POSIXは、このLC_CTYPEファセットが、std::setlocaleの後の呼び出しに関係なく、このストリームでのすべての将来のI/Oに使用されることを要求しています。
テキストの各行は、本質的に人間が読めるデータで構成されることが意図されています。POSIX実装では、テキストストリームとバイナリストリームを区別しません('\n'または他の文字に対する特別なマッピングはありません)。
[編集] 関連項目
| 生のデバイスを抽象化する (クラステンプレート) | |
| 生のファイルデバイスを実装する (クラステンプレート) | |
| 入力ストリームに関連付けられた FILE* 型の式 出力ストリームに関連付けられた FILE* 型の式 エラー出力ストリームに関連付けられた FILE* 型の式 (マクロ定数) | |
| Cドキュメント(FILEについて)
| |