我假设如果文件已经打开,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);
}
编辑: 添加了额外的代码,将一些数据写入fp1和fp2并查看行为。如果执行,file1.txt包含数据&#34; BMS&#34;并且似乎是正确的行为,fp1和fp2按预期独立移动。首先使用fp1编写AMS,然后使用fp2将A替换为B,最终输出为BMS。
答案 0 :(得分:4)
根据C标准(7.19.3.8),它是实现定义的:
打开其他(非临时)文件的函数需要文件名,这是一个字符串。组成有效文件名的规则是实现定义的。同一个文件是否可以同时打开多次也是实现定义的。
最重要的是,出于其他原因不鼓励,例如参见SEI CERT C Coding Standard's FIO24-C recommendation:
某些实现不允许同时打开同一文件的多个副本。因此,可移植代码不能取决于违反此规则会发生什么。即使在完全不能打开已经打开的文件的实现上,也存在TOCTOU(检查时间,使用时间)竞争条件,其中第二次打开可以在与第一次打开的文件不同的文件上操作正在移动或删除的文件(请参阅FIO45-C。访问文件时避免TOCTOU竞争条件,以获取有关TOCTOU竞争条件的详细信息)。