【问题标题】:Does fopen give back an adress?fopen 会返回地址吗?
【发布时间】:2022-01-16 11:17:53
【问题描述】:

所以我声明了一个FILE 类型的指针*f,现在我说该指针等于fopen("text.txt", "r")。那么既然指针存储了一个地址,那么fopen是不是返回了一个文件的地址呢?

FILE *f;
f = fopen("text.txt","r");

【问题讨论】:

  • C11 7.2.1 "标题<stdio.h> 声明了FILE 类型,它是一种能够记录控制流所需的所有信息的对象类型,包括它的文件位置指示符、指向它的指针关联缓冲区(如果有的话),一个记录是否发生读/写错误的错误指示器,以及一个记录是否到达文件末尾的文件结束指示器”(我做了一些小编辑)
  • 不是文件本身的地址,而是描述文件的一些东西的地址。不过,它是一个指针并不重要。取消引用它没有任何意义,你所做的只是将它传递给处理文件的标准函数。
  • 它返回一个内存数据结构的地址,其中包含与文件和打开相关的数据,例如文件名、打开方式、当前文件指针(文件中的相对地址等) .
  • 它是否是一个地址并不重要,因为无论如何你都不打算取消引用它。因为它有一个*,所以它在技术上是一个指针,但就你所知,它可能是也可能不是转换为指针的整数(或不是)。
  • “为什么文件类型不透明” 因为您的目的是将其传递给标准函数,而不是取消引用它。无法取消引用 = 不透明。

标签: c file


【解决方案1】:

fopen 是否返回文件地址?

没有。没有“文件地址”之类的东西。

fopen 返回的是一个指向动态分配的不透明结构FILE 的指针,它描述了如何 获取文件的内容。从某种意义上说,此描述是不透明的,它没有为您提供有用的信息。但是fgets()fread() 等例程知道如何使用该信息来获取实际的文件内容。

fclose 会释放此结构,因此如果您有匹配的fopenfclose,则不会出现内存泄漏(来自这些函数)。

【讨论】:

  • 如果我不使用 fclose 关闭它会发生什么? fclose有什么用?
  • @Tenko fclose() 将任何未完成的缓冲数据写入磁盘(如果它是为写入而打开的文件)并清理 FILE 对象使用的所有资源(如释放分配的内存并关闭 OS-级文件描述符)。如果您不使用它,就会发生泄漏并可能丢失数据。
【解决方案2】:

函数fopen 正在返回FILE 类型对象的地址。根据§7.21.1 ¶2 of the ISO C11 standard,这个对象必须能够

记录控制流所需的所有信息,包括其文件位置指示符、指向其关联缓冲区的指针(如果有)、记录是否发生读/写错误的错误指示符以及结束-记录是否已到达文件末尾的文件指示器;

此对象的确切大小和内容可能因编译器而异,一般程序员对此并不感兴趣。一般程序员必须知道的是,他们必须将 fopen 返回的指针传递给 C 标准库提供的其他 I/O 函数。

【讨论】:

    【解决方案3】:

    该标准未指定应如何定义FILE。它唯一说的是当您将该类型的对象传递给各种函数时会得到什么结果。这意味着这种类型在各种实现中可能不同。这是一种使用方式:

    typedef struct _iobuf
    {
        char*   _ptr;
        int _cnt;
        char*   _base;
        int _flag;
        int _file;
        int _charbuf;
        int _bufsiz;
        char*   _tmpfname;
    } FILE;
    

    来自MinGW32。

    【讨论】:

      【解决方案4】:

      是的,它返回了FILE 对象的地址。现在这种类型是不透明的。也就是说,您不知道被引用的数据结构的实际内容,因此绝不能取消引用指针(幸运的是,编译器不会让您侥幸逃脱)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2011-05-28
        • 2016-01-10
        相关资源
        最近更新 更多