FILE
| ヘッダー <stdio.h> で定義 |
||
| typedef /* unspecified */ FILE; |
||
各 FILE オブジェクトは C ストリームを表します。
C 標準では、FILE が完全なオブジェクト型であるかどうかは規定されていません。有効な FILE をコピーできる場合でも、そのコピーへのポインタを I/O 関数の引数として使用すると、未指定の動作が発生します。つまり、FILE は意味的にコピー不可能である可能性があります。
I/O ストリームは、フォーマットされていない入力と出力、およびフォーマットされた入力と出力の両方に使用できます。さらに、入出力はロケールに依存する場合があり、必要に応じてワイド/マルチバイト変換が実行されます。
目次 |
[編集] ストリームの状態
デバイスへのアクセスに必要なシステム固有の情報(例:POSIX ファイルディスクリプタ)とは別に、各 FILE オブジェクトは直接または間接的に以下の情報を持っています。
- (C95) 文字幅:未設定、ナロー、またはワイド。
- (C95) マルチバイト文字とワイド文字間の変換のための解析状態(mbstate_t 型のオブジェクト)
- バッファリング状態:バッファリングなし、ラインバッファリング、フルバッファリング。
- バッファ。これは、外部のユーザー提供バッファに置き換えることができます。
- I/O モード:入力、出力、または更新(入力と出力の両方)。
- バイナリ/テキストモードインジケータ。
- ファイルの終端ステータスインジケータ。
- エラーステータスインジケータ。
- ファイル位置インジケータ。fpos_t 型のオブジェクトとしてアクセス可能で、ワイドストリームの場合、解析状態が含まれます。
- (C11) 複数のスレッドがストリームの読み取り、書き込み、配置、または位置のクエリを行う際にデータ競合を防ぐために使用される再入可能ロック。
[編集] ナローおよびワイドオリエンテーション
新しく開かれたストリームにはオリエンテーションがありません。fwide または任意の I/O 関数の最初の呼び出しがオリエンテーションを確立します。ワイド I/O 関数はストリームをワイドオリエンテーションにし、ナロー I/O 関数はストリームをナローオリエンテーションにします。設定されたオリエンテーションは、freopen でのみ変更できます。ナロー I/O 関数はワイドオリエンテーションのストリームで呼び出すことはできません。ワイド I/O 関数はナローオリエンテーションのストリームで呼び出すことはできません。ワイド I/O 関数は、ストリームによって記述された変換状態を使用して mbrtowc または 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 ファセットが、その後の setlocale の呼び出しに関係なく、このストリームでのすべての将来の I/O に使用されることを要求しています。
テキストの各行は、本質的に人間が読めるデータで構成されることが意図されています。POSIX 実装では、テキストストリームとバイナリストリームを区別しません('\n' やその他の文字に対する特別なマッピングはありません)。
[編集] 参考文献
- C17標準 (ISO/IEC 9899:2018)
- 7.21 Input/output <stdio.h> (p: 217-247)
- 7.29 Extended multibyte and wide character utilities <wchar.h> (p: 295-325)
- C11標準 (ISO/IEC 9899:2011)
- 7.21 Input/output <stdio.h> (p: 296-339)
- 7.29 拡張マルチバイト文字とワイド文字のユーティリティ <wchar.h> (p: 402-446)
- C99標準 (ISO/IEC 9899:1999)
- 7.19 Input/output <stdio.h> (p: 262-305)
- 7.24 拡張マルチバイト文字とワイド文字のユーティリティ <wchar.h> (p: 348-392)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.9 INPUT/OUTPUT <stdio.h>
[編集] 関連項目
| 入力ストリームに関連付けられた型 FILE* の式 出力ストリームに関連付けられた型 FILE* の式 エラー出力ストリームに関連付けられた型 FILE* の式 (マクロ定数) | |
| C++ ドキュメント FILE
| |