【发布时间】:2014-03-05 01:20:07
【问题描述】:
如果我们写:
//in main
FILE *p = fopen("filename", "anymode");
我的问题是:p 指向什么?
【问题讨论】:
如果我们写:
//in main
FILE *p = fopen("filename", "anymode");
我的问题是:p 指向什么?
【问题讨论】:
文件指针p 指向一个由C 库处理的结构,该结构在给定的打开模式下管理命名文件的I/O 功能。
您无法先验地判断它指向的是静态分配的内存还是动态分配的内存;你不需要知道。你把它当作一个不透明的指针。
请注意,标准说:
ISO/IEC 9899:2011 7.21.3 文件
用于控制流的
FILE对象的地址可能很重要;FILE对象的副本不需要代替原始对象。
这(粗略地)说:不要乱用指针;将它传递给需要它的函数,否则就别管它了。
【讨论】:
FILE。你从fopen() 得到的是一个FILE *,它指向一个FILE 结构。指向的结构包含库管理文件 I/O 所需的所有信息。一个后果是它很少包含文件名。文件打开后就不需要了。 FILE 结构不是缓冲区;缓冲区是一个字符数组。 FILE 结构包含指向缓冲区的指针,由系统提供或由用户通过setvbuf() 或setbuf() 提供。 [...继续...]
FILE * 也会避免单字符操作可以)。
p 指向一个包含FILE 结构的内存位置。这就是您真正需要知道的全部内容,该结构的内容完全是特定于实现的。
如果它在封装方面正确实现(即,作为不透明的结构),您甚至不应该能够找出它包含的内容。
您应该使用它(除非您是标准库的实现者)从fopen 接收它并将其传递给需要FILE * 的其他函数,例如fwrite、fread和fclose。
【讨论】:
p 是指向存储在fopen() 中的FILE 对象的指针。
它实际上是指向文件的流的指针,通过它可以执行操作。但是,对象的实际内部工作被抽象掉了。
来自http://www.cplusplus.com/reference/cstdio/fopen/:
打开
FILE * fopen ( const char * filename, const char * mode );
打开名称在参数文件名中指定的文件,并将其与一个流相关联,该流可以在以后的操作中通过返回的 FILE 指针来标识。
【讨论】: