FILE类型的对象的属性是什么

时间:2011-02-01 12:25:05

标签: c file properties stdio

  

FILE对象通常由a创建   调用fopen或tmpfile,其中   两者都返回一个引用   这些对象。

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

4 个答案:

答案 0 :(得分:2)

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

  1. 打开文件的两个偏移,一个用于阅读,一个用于写入;
  2. 是打开文件进行阅读,写作还是两者兼而有之;
  3. 是否为二进制或文本I / O打开文件;
  4. 流的EOF /错误状态;
  5. 缓冲区;
  6. 表示块缓冲或行缓冲的标志;
  7. charwchar_t方向;
  8. ungetc放入流中的最后一个字符。
  9. 如果我没有忘记任何事情,那么您可以使用stdio函数访问这些函数,这些函数构成了FILE对象使用和检查的唯一界面。由于FILE是不透明的,因此您不应该知道 如何保留所有这些信息。

    POSIX另外指定您可以使用fileno函数/宏检索基础文件描述符。

答案 1 :(得分:2)

答案是它取决于平台。至少在Linux上使用glibc,FILE实际上是来自_IO_FILE的typedef,它在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
};

正如马丁约克在评论中所说,你不应该知道这种结构的内部结构。结构的这种特定定义不保证在实现中是相同的;我希望MSVC的文件结构不同。

答案 2 :(得分:1)

来自C语言标准草案n1256,第7.19.1段,第2段:

声明的类型是size_t(在7.17中描述);

FILE

这是一种能够记录控制所需信息的对象类型 流,包括其文件位置指示符,指向其关联缓冲区(如果有)的指针,a 记录是否发生读/写错误的错误指示符,以及记录是否已到达文件末尾的文件结尾指示符;和

fpos_t

这是一种除了能够记录所有信息的数组类型之外的对象类型 需要唯一地指定文件中的每个位置。

FILE类型的确切内容是依赖于实现的,并不意味着直接访问。

答案 3 :(得分:0)

快速回答 - 对不起。

FILE是一个句柄,而不是一个结构。它基本上表示对要读取或写入的文件的锁定。

我建议阅读有关fopen电话的帮助,例如,有很多在线帮助。

希望这有助于。