Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中无fclose的fopen_C_File_File Io - Fatal编程技术网

C中无fclose的fopen

C中无fclose的fopen,c,file,file-io,C,File,File Io,如果我使用fopen打开一个文件n次而不调用fclose,会发生什么情况 可能会出现任何缓冲区溢出问题?您浪费了底层文件句柄。请及时关闭您打开的所有文件,以避免资源泄漏。如果您继续打开文件而不关闭它们,那么您将在应用程序级别或操作系统级别的某个时候用完文件描述符,所有进一步打开文件的尝试都将失败。如果您继续在没有fclose的情况下fopen,那么最终您对fopen的调用将开始失败。程序可用的文件描述符数量有限 。但是,一个文件可以打开多次。文件描述符是独立的,不会相互干扰(假设您只是读取而不是

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


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

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

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

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


。但是,一个文件可以打开多次。文件描述符是独立的,不会相互干扰(假设您只是读取而不是写入文件)


当您尝试它时会发生什么?不要将标准C函数名大写。C是区分大小写的。您是否要求多次打开同一个文件?此外,调用
fclose
可确保在应用程序中止时写入文件的任何数据不会丢失。您让它听起来像是有一个巨大的全球文件句柄池,全世界所有计算机都共享。请回收您的文件句柄。:)@jdizzle:配给下周开始,现在就抓紧所有能抓到的东西!为了进一步了解,我记得在DOS早期,您可以设置可以作为环境变量打开的可用文件的数量——当然,在一定程度上。我相信默认值可能是25,对于某些应用程序,肯定需要设置得更高,因为其中一些应用程序是由操作系统本身使用的。是的,同样的情况也发生了。fopen在大约1000次呼叫后失败。我关闭了它,谢谢。
#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'