2

FILE オブジェクトは通常、fopen または tmpfile の呼び出しによって作成され、どちらもこれらのオブジェクトのいずれかへの参照を返します。

FILE という名前の構造体の属性は何ですか?それともプラットフォームに依存しますか?

4

4 に答える 4

2

答えは、プラットフォームに依存するということです。少なくとも Linux で glibc を使用すると、実際には に実装されてFILEいる typedef になります。_IO_FILElibio.h

struct _IO_FILE {
  int _flags;       /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags

  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */

#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  /*  char* _save_gptr;  char* _save_egptr; */

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

Martin York がコメントで述べているように、この構造の内部構造について知る必要はありません。構造体のこの特定の定義は、実装間で同じであるとは限りません。MSVC のファイル構造は異なると思います。

于 2011-02-01T12:57:17.730 に答える
2

FILEは、プラットフォームに依存する型でありstruct、最終的には少なくとも

  1. 開かれたファイルへの 2 つのオフセット。1 つは読み取り用、もう 1 つは書き込み用です。
  2. ファイルが読み取り、書き込み、またはその両方で開かれているかどうか。
  3. ファイルがバイナリまたはテキスト I/O 用に開かれているかどうか。
  4. ストリームの EOF/エラー状態。
  5. バッファ;
  6. ブロックバッファリングまたはラインバッファリングを示すフラグ。
  7. charまたはwchar_tオリエンテーション;
  8. によってストリームに入れられた最後の文字ungetc

私が何も忘れていなければ、これがstdio関数でアクセスできるすべてであり、それらはオブジェクトの使用と検査のための唯一のインターフェースを形成しFILEます。は不透明であるため、このすべての情報がどのようFILEに保持されているかを知る必要はありません。

filenoさらに、POSIX は、関数/マクロを使用して基になるファイル記述子を取得できることを指定しています。

于 2011-02-01T12:54:51.133 に答える
1

C 言語標準のドラフトn1256、§ 7.19.1、パラグラフ 2 から:

宣言されている型は次のとおりですsize_t(7.17 で説明)。

    FILE

これは、ストリームの制御に必要なすべての情報を記録できるオブジェクト タイプであり、ファイル位置インジケータ、関連付けられたバッファへのポインタ (存在する場合)、 読み取り/書き込みエラーが発生したかどうかを記録するエラー インジケータ、およびファイルの終わりに達したかどうかを記録するファイルの終わりインジケーター。ファイル内のすべての位置を

    fpos_t

一意に指定するために必要なすべての情報を記録できる配列型以外のオブジェクト型です。

FILE 型の正確な内容は実装に依存し、直接アクセスするためのものではありません。

于 2011-02-01T13:45:08.910 に答える
0

簡単な回答 - これについては申し訳ありません。

FILE はハンドルであり、構造体ではありません。基本的に、読み取りまたは書き込みを行っているファイルのロックを表します。

たとえば、fopen 呼び出しに関するヘルプを読むことをお勧めします。オンライン ヘルプはたくさんあります。

これが役立つことを願っています。

于 2011-02-01T12:35:11.900 に答える