fopen example
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
FILE * pFile;
for(int i=0; i < 1000000; i++)
{
bool ret = remove("C:\\abc.txt");
pFile = fopen ("C:\\abc.txt","w");
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
fclose (pFile);
}
else
{
printf("%d fopen() fails \n", count);
}
}
return 0;
}
这里,在调用remove之后,pFile = fopen(&#34; C:\ abc.txt&#34;,&#34; w&#34;);被调用,
有时即使在C:\中,在删除被调用后,abc.txt文件也不存在,但是fopen pFile指针为空。
这种情况有时并非总是如此。在此示例中,此问题再现50/60次。
请提出一些解决方案。
答案 0 :(得分:1)
如果您已经确定基础文件系统中的竞争条件存在问题,则修正它的正确方法是(如BLUEPIXY所建议的)只需删除remove
调用:
pFile = fopen ("C:\\abc.txt","w");
如果文件不存在,将创建该文件,如果文件存在则将其截断为0大小,这正是您所需要的。
答案 1 :(得分:0)
如果您需要在删除文件后立即创建文件,可以延迟fopen直到您确认旧的&#34; abc.txt&#34;文件已删除。
为此你需要引入一些循环来确认它,如下所示,
bool ret = remove("C:\\abc.txt");
FILE * rFile;
while(true)
{
rFile = fopen ("C:\\abc.txt","r");
if(rfile == null)
break; //File Removed confirmed!!
else
sleep(100); //Loop around again...
}
pFile = fopen ("C:\\abc.txt","w");
if (pFile!=NULL)