FILE 对象通常是通过调用 fopen 或 tmpfile 创建的,它们都返回对这些对象之一的引用。
名为 FILE 的 Struct 的属性是什么,还是依赖于平台?
FILE 对象通常是通过调用 fopen 或 tmpfile 创建的,它们都返回对这些对象之一的引用。
名为 FILE 的 Struct 的属性是什么,还是依赖于平台?
FILE
是一个依赖于平台的类型,很可能是 a struct
,它最终至少包含或指向:
char
或wchar_t
方向;ungetc
。如果我没有忘记任何事情,这就是您可以使用stdio
函数访问的所有内容,并且这些函数构成了使用和检查FILE
对象的唯一界面。由于FILE
它是不透明的,因此您不应该知道它如何保存所有这些信息。
fileno
POSIX 还指定您可以使用函数/宏检索底层文件描述符。
答案是它依赖于平台。至少在 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 的文件结构会有所不同。
来自 C 语言标准的草案n1256,第 7.19.1 节,第 2 段:
声明的类型是size_t
(在 7.17 中描述);
FILE
它是一种对象类型,能够记录控制流所需的所有信息,包括其文件位置指示符、指向其关联缓冲区(如果有)的 指针、记录是否发生读/写错误的错误指示符以及文件结束指示器,记录是否已到达文件末尾;它是一种对象类型,
fpos_t
而不是数组类型,能够记录唯一指定文件中每个位置所需的所有信息。
FILE 类型的确切内容取决于实现,并不意味着可以直接访问。
快速回答 - 对此感到抱歉。
FILE 是句柄,而不是结构。它基本上代表您正在读取或写入的文件的锁定。
我建议阅读与 fopen 调用相关的帮助,例如,有很多在线帮助。
希望这会有所帮助。