Raj*_*esh 1 c file-handling mingw32
我假设如果文件已经打开则fopen返回NULL指针。但如果文件已经打开,它看起来fopen不会返回NULL"w"模式下。下面是我用来尝试这个的代码,我没有收到任何错误。我尝试过 mingw32 以及 TDM-GCC-64 编译器。如果我没记错的话,如果文件已经打开,C++ 会报错。
#include<stdio.h>
int main()
{
FILE *fp1, *fp2;
fp1 = fopen("file1.txt", "w");
fp2 = fopen("file1.txt", "w");
if(fp2 == NULL)
{
printf("Error in opening file\n");
return(0);
}
// Edit: added following code to check the behavior if write operation
// is performed simultaneously
fputc('A', fp1);
fputc('M', fp1);
fputc('S', fp1);
fputc('B', fp2);
fclose(fp1);
fclose(fp2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:增加了额外的代码来写一些数据都fp1和fp2和看到的行为。如果执行,file1.txt包含数据BMS和似乎是正确的行为,fp1并fp2如预期独立移动。首先AMS利用被写入fp1,然后A被替换B使用fp2和最终产量BMS。
根据 C 标准 (7.19.3.8),它是实现定义的:
打开附加(非临时)文件的函数需要一个文件名,它是一个字符串。组成有效文件名的规则是实现定义的。同一个文件是否可以同时打开多次也是实现定义的。
最重要的是,由于其他原因,不鼓励这样做,例如参见SEI CERT C 编码标准的 FIO24-C 建议:
某些实现不允许同时打开同一文件的多个副本。因此,可移植代码不能依赖于如果违反此规则会发生什么。即使在不完全无法打开已打开文件的实现上,也存在 TOCTOU(检查时间,使用时间)竞争条件,其中第二次打开可能对与第一个不同的文件进行操作,原因是正在移动或删除的文件(有关 TOCTOU 竞争条件的更多详细信息,请参阅 FIO45-C。在访问文件时避免 TOCTOU 竞争条件)。