FILE オブジェクトは通常、fopen または tmpfile の呼び出しによって作成され、どちらもこれらのオブジェクトのいずれかへの参照を返します。
FILE という名前の構造体の属性は何ですか?それともプラットフォームに依存しますか?
FILE オブジェクトは通常、fopen または tmpfile の呼び出しによって作成され、どちらもこれらのオブジェクトのいずれかへの参照を返します。
FILE という名前の構造体の属性は何ですか?それともプラットフォームに依存しますか?
答えは、プラットフォームに依存するということです。少なくとも Linux で glibc を使用すると、実際には に実装されてFILE
いる typedef になります。_IO_FILE
libio.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 のファイル構造は異なると思います。
FILE
は、プラットフォームに依存する型でありstruct
、最終的には少なくとも
char
またはwchar_t
オリエンテーション;ungetc
。私が何も忘れていなければ、これがstdio
関数でアクセスできるすべてであり、それらはオブジェクトの使用と検査のための唯一のインターフェースを形成しFILE
ます。は不透明であるため、このすべての情報がどのようFILE
に保持されているかを知る必要はありません。
fileno
さらに、POSIX は、関数/マクロを使用して基になるファイル記述子を取得できることを指定しています。
C 言語標準のドラフトn1256、§ 7.19.1、パラグラフ 2 から:
宣言されている型は次のとおりですsize_t
(7.17 で説明)。
FILE
これは、ストリームの制御に必要なすべての情報を記録できるオブジェクト タイプであり、ファイル位置インジケータ、関連付けられたバッファへのポインタ (存在する場合)、 読み取り/書き込みエラーが発生したかどうかを記録するエラー インジケータ、およびファイルの終わりに達したかどうかを記録するファイルの終わりインジケーター。ファイル内のすべての位置を
fpos_t
一意に指定するために必要なすべての情報を記録できる配列型以外のオブジェクト型です。
FILE 型の正確な内容は実装に依存し、直接アクセスするためのものではありません。
簡単な回答 - これについては申し訳ありません。
FILE はハンドルであり、構造体ではありません。基本的に、読み取りまたは書き込みを行っているファイルのロックを表します。
たとえば、fopen 呼び出しに関するヘルプを読むことをお勧めします。オンライン ヘルプはたくさんあります。
これが役立つことを願っています。