最近接触一个垃圾程序,出现一个奇怪的bug,现象是两次fopen不同的文件返回相同的FILE*地址,第二次返回的FILE*有时候无端端的就被关闭了。以下代码是对这个bug的概括:
auto fp1 = fopen("c:/1.txt", "rb");
char buff[10];
assert(fread(buff, 1, 10, fp1) == 10);
// 垃圾程序关闭fp1时没有至fp1=nullptr
fclose(fp1);
// 微软的crt对FILE*使用缓存机制,所以这里返回的fp2==fp1,可参考stream.c里的_getstream函数
auto fp2 = fopen("c:/1.txt", "rb");
// 垃圾程序的垃圾结构引起第二次关闭fp1,事实上,这里将引起fp2的关闭
fclose(fp1);
// 于是垃圾程序读fp2失败
assert(fread(buff, 1, 10, fp2) == 10);
最后,都用C++喇,谁tmd还用fopen这么古老的api,次凹!!!!