Namespaces
Variants

FILE

From cppreference.net
< c ‎ | io
ヘッダーで定義 <stdio.h>
typedef /* 未指定 */ FILE ;

FILE オブジェクトはCストリームを表します。

C標準では FILE が完全なオブジェクト型であるかどうかを規定していません。有効な FILE のコピーを作成することは可能かもしれませんが、そのようなコピーへのポインタをI/O関数の引数として使用すると、未規定の動作を引き起こします。言い換えれば、 FILE は意味的にコピー不可である可能性があります。

I/Oストリームは、フォーマットなしおよびフォーマット済みの入力と出力の両方に使用できます。さらに、入出力を扱う関数はロケールを考慮することも可能であり、必要に応じてワイド文字/マルチバイト変換が実行されます。

目次

翻訳の説明: - 「Contents」→「目次」に翻訳 - C++関連の専門用語(Stream state、Narrow and wide orientation、Binary and text modes)は原文のまま保持 - HTMLタグ、属性、クラス名は一切変更せず - 番号部分(tocnumber)はそのまま保持 - 一般的な項目名(Notes、References、See also)は原文のまま保持

ストリーム状態

デバイスにアクセスするために必要なシステム固有の情報( 例: POSIXファイル記述子)に加えて、各 FILE オブジェクトは直接または間接的に以下を保持します:

  1. (C95) 文字幅:未設定、ナロー、またはワイド。
  2. (C95) マルチバイト文字とワイド文字の変換における解析状態( mbstate_t 型のオブジェクト)
  3. バッファリング状態:非バッファリング、行バッファリング、完全バッファリング。
  4. 外部から提供されたユーザー定義バッファで置換可能なバッファ。
  5. I/Oモード:入力、出力、または更新(入力と出力の両方)。
  6. バイナリ/テキストモード指示子。
  7. ファイル終端状態指示子。
  8. エラー状態指示子。
  9. fpos_t 型のオブジェクトとしてアクセス可能なファイル位置指示子(ワイドストリームの場合、解析状態を含む)。
  10. (C11) 複数スレッドがストリームの読み込み、書き込み、位置設定、位置問い合わせを行う際のデータ競合を防止するためのリエントラントロック。

ナローおよびワイド方向性

新しく開かれたストリームには方向性がありません。最初の fwide の呼び出し、または任意のI/O関数の呼び出しによって方向性が確立されます:ワイドI/O関数はストリームをワイド方向にし、ナローI/O関数はストリームをナロー方向にします。一度設定されると、方向性は freopen のみで変更できます。ナローI/O関数はワイド方向のストリームに対して呼び出すことができません。ワイドI/O関数はナロー方向のストリームに対して呼び出すことができません。ワイドI/O関数は、ストリームによって記述される変換状態を使用して mbrtowc または wcrtomb を呼び出すかのように、ワイド文字とマルチバイト文字の間で変換を行います。プログラム内で有効なマルチバイト文字列とは異なり、ファイル内のマルチバイト文字シーケンスには埋め込まれたnull文字が含まれる可能性があり、初期シフト状態で開始または終了する必要はありません。

ワイド向きを持つストリームの変換状態は、ストリームの向きが設定される時点でインストールされているCロケールによって確立されます。

バイナリモードとテキストモード

テキストストリーム は、行を構成できる順序付けられた文字のシーケンスです。行は、0個以上の文字と終端の ' \n ' (「改行」文字)に分解できます。最終行に終端の ' \n ' が必要かどうかは実装定義です。さらに、OSにおけるテキスト表現の規則に準拠するために、入力および出力時に文字を追加、変更、または削除する必要がある場合があります(特に、Windows OS上のCストリームは、出力時に ' \n ' ' \r \n ' に変換し、入力時に ' \r \n ' ' \n ' に変換します)。

テキストストリームから読み込まれたデータが、以前にそのストリームに書き出されたデータと等しいと比較されることが保証されるのは、以下の各条件がすべて満たされた場合のみです:

  • データは印刷文字および/または制御文字 ' \t ' ' \n ' のみで構成される(特にWindows OSでは、文字 ' \0 x1A' が入力を終了する)。
  • ' \n ' 文字の直前にスペース文字が存在しない(そのようなスペース文字は、後でその出力が入力として読み込まれる際に消失する可能性がある)。
  • 最後の文字は ' \n ' である。

バイナリストリーム は、内部データを透過的に記録できる順序付けられた文字シーケンスです。バイナリストリームから読み込まれたデータは、常にそのストリームに以前書き込まれたデータと等しくなりますが、実装はストリームの末尾に不定数のヌル文字を追加することが許可されています。ワイドバイナリストリームは初期シフト状態で終わる必要はありません。

注記

POSIXは明示的に、現在インストールされているCロケールの LC_CTYPE ファセットが、ストリームの向きがワイドになった時点で FILE オブジェクト内に保存されることを要求しています。POSIXは、この LC_CTYPE ファセットが、向きが変更されるまで、その後 setlocale が呼び出されたかどうかに関係なく、このストリームでの全ての将来のI/Oに使用されることを要求しています。

各テキスト行は本質的に人間が読めるデータで構成されることを意図しています。POSIX実装ではテキストストリームとバイナリストリームを区別しません( ' \n ' またはその他の文字に対する特別なマッピングは存在しません)。

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.21 入出力 <stdio.h> (p: 217-247)
  • 7.29 拡張マルチバイトおよびワイド文字ユーティリティ <wchar.h> (p: 295-325)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.21 入出力 <stdio.h> (p: 296-339)
  • 7.29 拡張マルチバイト・ワイド文字ユーティリティ <wchar.h> (p: 402-446)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.19 入出力 <stdio.h> (p: 262-305)
  • 7.24 拡張マルチバイト・ワイド文字ユーティリティ <wchar.h> (p: 348-392)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.9 入出力 <stdio.h>

関連項目

入力ストリームに関連付けられた型 FILE * の式
出力ストリームに関連付けられた型 FILE * の式
エラー出力ストリームに関連付けられた型 FILE * の式
(マクロ定数)