2

FILE 对象通常是通过调用 fopen 或 tmpfile 创建的,它们都返回对这些对象之一的引用。

名为 FILE 的 Struct 的属性是什么,还是依赖于平台?

4

4 回答 4

2

FILE是一个依赖于平台的类型,很可能是 a struct,它最终至少包含或指向:

  1. 打开文件的两个偏移量,一个用于读取,一个用于写入;
  2. 是否打开文件以进行读取、写入或两者兼而有之;
  3. 文件是为二进制还是文本 I/O 打开的;
  4. 流的 EOF/错误状态;
  5. 缓冲区;
  6. 指示块缓冲或行缓冲的标志;
  7. charwchar_t方向;
  8. 放入流中的最后一个字符ungetc

如果我没有忘记任何事情,这就是您可以使用stdio函数访问的所有内容,并且这些函数构成了使用和检查FILE对象的唯一界面。由于FILE它是不透明的,因此您不应该知道它如何保存所有这些信息。

filenoPOSIX 还指定您可以使用函数/宏检索底层文件描述符。

于 2011-02-01T12:54:51.133 回答
2

答案是它依赖于平台。至少在 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 的文件结构会有所不同。

于 2011-02-01T12:57:17.730 回答
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 回答