我假设如果文件已经打开,fopen返回NULL指针。 但是如果文件已经在“w”模式下打开,它看起来fopen不会返回NULL。 下面是我用来尝试这个的代码,我没有收到任何错误。 我尝试使用mingw32以及TDM-GCC-64编译器。 如果我没有弄错的话,如果文件已经打开,C ++会给出错误。
#include int main() { FILE *fp1, *fp2; fp1=fopen("file1.txt", "w"); fp2=fopen("file1.txt", "w"); if(fp2==NULL) { printf("Error in opening filen"); 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包含数据“BMS”并且似乎是正确的行为,并且fp1和fp2按预期独立移动。 首先使用fp1写入AMS,然后使用fp2将A替换为B,最终输出为BMS。
根据C标准(7.19.3.8),它是实现定义的:
打开其他(非临时)文件的函数需要文件名,这是一个字符串。 组成有效文件名的规则是实现定义的。 同一文件是否可以同时打开多次也是实现定义的。
最重要的是,出于其他原因不鼓励,例如参见SEI CERT C Coding Standard的FIO24-C推荐 :
某些实现不允许同时打开同一文件的多个副本。 因此,可移植代码不能取决于违反此规则会发生什么。 即使在完全不能打开已经打开的文件的实现上,也存在TOCTOU(检查时间,使用时间)竞争条件,其中第二次打开可以在与第一次打开的文件不同的文件上运行正在移动或删除的文件(请参阅FIO45-C。访问文件时避免TOCTOU竞争条件,以获取有关TOCTOU竞争条件的更多详细信息)。
以上就是c/c++开发分享如果文件已经打开,fopen会返回NULL指针相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522237.html