例如,如果我们声明一个文件指针fp
并打开一个这样的文件:
FILE* fp = fopen("filename","w");
如果文件未打开,fopen
将NULL
返回到文件指针fp
。如果文件打开,文件指针fp
中存储了什么?
答案 0 :(得分:2)
C委员会N1570草案对此进行了说明,关于FILE*
:
7.21.3文件
...
- 用于控制流的
FILE
对象的地址可能很重要。FILE
对象的副本不需要代替原始对象。
fopen()
返回的指针指向FILE
结构,该结构的内容是特定于实现的(这意味着它们在不同的平台中是不同的)。
即使您知道特定实现中该结构的内容,您也不应尝试访问其任何成员或编写依赖于您对那些成员的了解的代码(即使可以做这样的事情。
答案 1 :(得分:0)
从fopen()的手册页
成功完成
fopen()
后,返回FILE
指针。否则,返回NULL
并将errno
设置为指示 错误。
如果文件打开,文件指针中存储了什么? fopen()
返回FILE
结构,该结构不过是结构_IO_FILE
的别名>
/* The opaque type of streams. This is the definition used elsewhere. */
typedef struct _IO_FILE FILE; /* FILE is nothing but a structure which is _IO_FILE */
您可以在Linux标头stdio.h
中找到上述信息。有关struct_IO_FILE
所包含内容的信息可以在特定于平台的Linux机器中的libio.h
中找到,即根据平台的不同而有所不同,如下所示(在Linux平台上打开/usr/include/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
};