Namespaces
Variants

std:: FILE

From cppreference.net
< cpp ‎ | io ‎ | c
定義先ヘッダ <cstdio>
typedef /* unspecified */ FILE ;

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

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

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

目次

ストリーム状態

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

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

ナローおよびワイド配向

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

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

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

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

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

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

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

注記

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

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

関連項目

生デバイスを抽象化する
(クラステンプレート)
生ファイルデバイスを実装する
(クラステンプレート)
入力ストリームに関連付けられた FILE * 型の式
出力ストリームに関連付けられた FILE * 型の式
エラー出力ストリームに関連付けられた FILE * 型の式
(マクロ定数)