【发布时间】:2010-07-28 13:19:50
【问题描述】:
如果我使用fopen 打开一个文件一些n 次而不调用fclose 会发生什么?
可能会出现任何缓冲区溢出问题?
【问题讨论】:
-
当你尝试时会发生什么?
-
不要大写标准 C 函数名称。 C 区分大小写。
-
您是在询问是否要多次打开同一个文件?
如果我使用fopen 打开一个文件一些n 次而不调用fclose 会发生什么?
可能会出现任何缓冲区溢出问题?
【问题讨论】:
如果你在没有fclose 的情况下继续fopen,那么最终你未来对fopen 的调用将开始失败。您的程序可用的文件描述符数量有限。
【讨论】:
您浪费了底层文件句柄。请及时关闭您打开的所有文件,以避免这种资源泄漏。
【讨论】:
fclose 可确保写入文件的任何数据在应用程序中止时不会丢失。
如果您继续打开文件而不关闭它们,那么您将在某个时候用完文件描述符,无论是在应用程序级别还是在操作系统级别,并且所有进一步打开文件的尝试都将失败。
【讨论】:
除了像其他人回答的那样浪费进程的文件描述符之外,您还会浪费内存,因为每个文件流都管理由libc 内部分配的输入/输出缓冲区。
【讨论】:
正如其他人所提到的,您不想泄露文件描述符。但是可以多次打开单个文件。文件描述符是独立的,不会相互干扰(假设您只是读取而不是写入文件)。
#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'
【讨论】: