【问题标题】:What happens to FILE pointer after file is closed?文件关闭后 FILE 指针会发生什么变化?
【发布时间】:2012-01-16 11:36:49
【问题描述】:

我想知道文件关闭后 FILE 指针会发生什么。会是NULL吗?

基本上,我想在关闭文件之前检查文件是否已经关闭。

例如如下:

FILE *f;

if(f!=NULL)
{
  fclose(f);
}

我可以这样做还是有其他方法可以解决?

【问题讨论】:

    标签: c file fclose


    【解决方案1】:

    由于参数是按值传递的,fclose 无法将文件指针设置为NULL。由于fclose 可能会破坏FILE 你必须

    • 在执行fclose 后手动将文件指针设置为NULL(除非您使用FILE **,否则在不同的函数中关闭它将不起作用)
    • 无论您是否关闭它,都不要陷入“忘记”的境地(可能很棘手)

    【讨论】:

    • 在这种情况下,我怎样才能知道文件是否已经关闭。
    【解决方案2】:

    Peter Norvig引用Auguste Comte(1798-1857):

      "Nothing is destroyed until it is replaced"
    

    你可以使用宏:

      #define fclose(fp)  ((fp) ? fclose(fp) : 0, (fp) = 0)
    

    这解决了两个不同且相反的问题:

    • FILE * 指针在fclose 之后为 NULL,因此不能 fclose'd 两次。

    • 此版本的fclose 接受 NULL 参数。许多常见的 fclose 的版本——例如 HPUX、SGI 和 CYGWIN 中的版本——很满意 带 NULL。奇怪的是受 FreeBSD 启发的版本,例如 Linux, 而微软则不然。

    当然,宏引入了自己的问题:

    • 它没有返回正确的错误值。但如果你想看 这样,您可以使用额外的括号禁用宏,如:if ((fclose)(fp) == EOF){ /* handle error... */ }

    • 它没有函数语义,因为它使用了它的参数 多次。但很难想象这会导致问题。但是你可以使用(fclose)。或将其命名为 FCLOSE,以遵循惯例。

    【讨论】:

      【解决方案3】:

      FILE * 它是一个指向 FILE 结构的指针,当您调用 fclose() 时,它将销毁/释放 FILE 结构,但不会更改 FILE* 指针的值,这意味着它仍然具有该 FILE 结构的地址,而现在不是退出。

      任何使用 malloc 获取的指针都会发生同样的事情

      int a malloc(10);
      free(a);
      

      仍然 a 不会为 NULL

      在大多数情况下,我总是这样做

      free(a);
      a=NULL;
      

      编辑:您无法随时检查其是否已关闭/释放。只是为了确保您可以在 free/fclose 之后将其分配为 NULL,以便您可以检查其是否为 NULL 并继续..

      【讨论】:

        【解决方案4】:

        是的,您可以这样做。更好的方法是将fp 设置为NULL 否则

        它将是悬空指针(指向它不拥有或不存在的东西的指针)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-06
          • 1970-01-01
          • 1970-01-01
          • 2021-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多