检查文件是否存在后更改fopen模式的正确方法是什么?

时间:2019-07-20 08:29:44

标签: c

在我的程序中,我想检查日志文件是否已经存在,然后将一些数据写入其中。因此,我首先以模式“ a”打开它。如果返回NULL,我用“ w”重新打开它,写标题,然后再次用“ a”打开它以追加数据。但是一段时间后,我总是收到“打开的文件太多”的错误消息,因此显然将同一文件打开到同一指针仍然会打开一个新的句柄(我当时并不知道)。但是现在我不完全确定如何编写部分代码-我是否总是必须先关闭然后再次打开?

FILE *target;       
target= fopen (ComplPath, "a");

if (target == NULL) 
{   
    //fclose(target); ?!?!
    target= fopen (ComplPath, "w");
    if (target != NULL) 
    {
        fprintf(target, "Header-Text \n");  
        fprintf(target, "Data" \n);
        fclose(target);
    }
    else  
    {
        printf("Error at writeToLog: %s\n", strerror(errno));
    }  
}
else    
{
    fprintf(target, "data");
    fclose(target);
}   

在第一个之后查看是否:在用“ w”重新打开文件之前,我是否必须关闭文件?一直关闭并重新打开文件似乎效率很低。还是一般而言,有更好的方法可以完成此任务?

1 个答案:

答案 0 :(得分:1)

您应该只使用"a"模式打开文件一次,然后使用ftell()来确定是否创建了新文件。

与您的问题所提出的相反,"a""w"都会创建一个新文件(如果不存在)。区别在于"w"将把它截断为零长度(如果已经存在)。

FILE *target;       
target= fopen (ComplPath, "a");
if (!target) {
    /* error out */
}
if (ftell(target) == 0) {
    /* write the header */
}