【问题标题】:How does a FILE pointer in C work?C 中的 FILE 指针如何工作?
【发布时间】:2014-03-05 01:20:07
【问题描述】:

如果我们写:

//in main

FILE *p = fopen("filename", "anymode");

我的问题是:p 指向什么?

【问题讨论】:

    标签: c file


    【解决方案1】:

    文件指针p 指向一个由C 库处理的结构,该结构在给定的打开模式下管理命名文件的I/O 功能。

    您无法先验地判断它指向的是静态分配的内存还是动态分配的内存;你不需要知道。你把它当作一个不透明的指针。

    请注意,标准说:

    ISO/IEC 9899:2011 7.21.3 文件

    用于控制流的FILE 对象的地址可能很重要; FILE 对象的副本不需要代替原始对象。

    这(粗略地)说:不要乱用指针;将它传递给需要它的函数,否则就别管它了。

    【讨论】:

    • 除其他外,是的,它指向的结构包含指向文件缓冲区的指针。在 Unix 上,它记录作为文件流基础的文件描述符(在 Windows 上可能是某种文件句柄)。它包含有关文件和缓冲区中当前位置的信息;它包含有关推回字符的信息;它包含库正确处理 I/O 所需的所有信息。
    • 是结构体FILE中的指针不指向打开的文件还是通过缓冲区间接指向打开的文件
    • 你的问题有点混乱。有一个结构类型FILE。你从fopen() 得到的是一个FILE *,它指向一个FILE 结构。指向的结构包含库管理文件 I/O 所需的所有信息。一个后果是它很少包含文件名。文件打开后就不需要了。 FILE 结构不是缓冲区;缓冲区是一个字符数组。 FILE 结构包含指向缓冲区的指针,由系统提供或由用户通过setvbuf()setbuf() 提供。 [...继续...]
    • [...continuation...] 该结构不仅仅包含指向缓冲区的指针。我不确定 Windows 的详细信息,但该结构包含在 O/S 级别以符合 C 标准的方式管理文件所需的任何信息。短语“通过缓冲区间接指向打开的文件”是错误的;缓冲区是保存数据的字符数组,直到数据被读取或写入磁盘,因此系统不会执行单字符 I/O 操作(通常;即使是无缓冲的 FILE * 也会避免单字符操作可以)。
    • 非常感谢您的帮助
    【解决方案2】:

    p 指向一个包含FILE 结构的内存位置。这就是您真正需要知道的全部内容,该结构的内容完全是特定于实现的。

    如果它在封装方面正确实现(即,作为不透明的结构),您甚至不应该能够找出它包含的内容。

    您应该使用它(除非您是标准库的实现者)从fopen 接收它并将其传递给需要FILE * 的其他函数,例如fwritefreadfclose

    【讨论】:

      【解决方案3】:

      p 是指向存储在fopen() 中的FILE 对象的指针。

      它实际上是指向文件的流的指针,通过它可以执行操作。但是,对象的实际内部工作被抽象掉了。

      来自http://www.cplusplus.com/reference/cstdio/fopen/

      打开

      FILE * fopen ( const char * filename, const char * mode );
      

      打开名称在参数文件名中指定的文件,并将其与一个流相关联,该流可以在以后的操作中通过返回的 FILE 指针来标识。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 2021-07-13
        相关资源
        最近更新 更多