【问题标题】:fopen without fclose in C在 C 中没有 fclose 的 fopen
【发布时间】:2010-07-28 13:19:50
【问题描述】:

如果我使用fopen 打开一个文件一些n 次而不调用fclose 会发生什么?

可能会出现任何缓冲区溢出问题?

【问题讨论】:

  • 当你尝试时会发生什么?
  • 不要大写标准 C 函数名称。 C 区分大小写。
  • 您是在询问是否要多次打开同一个文件?

标签: c file file-io


【解决方案1】:

如果你在没有fclose 的情况下继续fopen,那么最终你未来对fopen 的调用将开始失败。您的程序可用的文件描述符数量有限。

See this related SO question.

【讨论】:

  • 只是为了获得更多信息,我记得在 DOS 的早期,您可以设置可以作为环境变量打开的可用文件的数量 - 当然,在一定程度上。我相信默认值可能是 25,对于某些应用程序肯定需要设置更高,因为其中一些是由操作系统本身使用的。
  • 是的,发生的情况完全一样。fopen 在调用了大约 1000 次后失败。我关闭了它,谢谢。
【解决方案2】:

您浪费了底层文件句柄。请及时关闭您打开的所有文件,以避免这种资源泄漏。

【讨论】:

  • 此外,调用fclose 可确保写入文件的任何数据在应用程序中止时不会丢失。
  • 你听起来好像有一个巨大的全球文件句柄池,全世界所有计算机都共享。请回收您的文件句柄。 :)
  • @jdizzle:配给下周开始,抓紧一切!
【解决方案3】:

如果您继续打开文件而不关闭它们,那么您将在某个时候用完文件描述符,无论是在应用程序级别还是在操作系统级别,并且所有进一步打开文件的尝试都将失败。

【讨论】:

    【解决方案4】:

    除了像其他人回答的那样浪费进程的文件描述符之外,您还会浪费内存,因为每个文件流都管理由libc 内部分配的输入/输出缓冲区。

    【讨论】:

      【解决方案5】:

      正如其他人所提到的,您不想泄露文件描述符。但是可以多次打开单个文件。文件描述符是独立的,不会相互干扰(假设您只是读取而不是写入文件)。

      #include <stdio.h>
      
      int main()
      {
          FILE* f1 = fopen("/tmp/foo.txt", "rb");
          FILE* f2 = fopen("/tmp/foo.txt", "rb");
          FILE* f3 = fopen("/tmp/foo.txt", "rb");
          FILE* f4 = fopen("/tmp/foo.txt", "rb");
      
          char buf1[32] = { 0, };
          char buf2[32] = { 0, };
          char buf3[32] = { 0, };
          char buf4[32] = { 0, };
      
          fread(buf1, 1, sizeof(buf1) - 1, f1);
          fread(buf2, 1, sizeof(buf2) - 1, f2);
          fread(buf3, 1, sizeof(buf3) - 1, f3);
          fread(buf4, 1, sizeof(buf4) - 1, f4);
      
          printf("buf1 = '%s'\n", buf1);
          printf("buf2 = '%s'\n", buf2);
          printf("buf3 = '%s'\n", buf3);
          printf("buf4 = '%s'\n", buf4);
      
          fclose(f1);
          fclose(f2);
          fclose(f3);
          fclose(f4);
      
          return 0;
      }
      

      提供如下输出:

      $ ./fopen 
      buf1 = '0123456789ABCDEFGHIJ0123456789a'
      buf2 = '0123456789ABCDEFGHIJ0123456789a'
      buf3 = '0123456789ABCDEFGHIJ0123456789a'
      buf4 = '0123456789ABCDEFGHIJ0123456789a'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多