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

标签 c

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

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);
}   

在第一个 if 之后查看:在使用“w”重新打开文件之前是否必须关闭文件?一直关闭并重新打开文件似乎效率很低。或者是否有更好的方法来完成这项任务?

最佳答案

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

与您的问题所暗示的相反,"a""w" 都会创建一个新文件(如果它不存在)。不同之处在于,如果"w"已经存在,则将其截断为零长度。

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

关于c - 检查文件是否存在后更改 fopen 模式的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123027/

相关文章:

c++ - 对于已定义的符号,静态库链接问题 "Undefined symbols"

C、读取 .bmp 时遇到问题

java - 如何在不使用任何内置方法或函数的情况下在恒定时间 (O(1)) 内获取字母表 (1-26) 中字符的数值/位置?

c++ - qsort() vs std::sort,比较函数哲学差异

在Windows上使用gcc 5.3.0编译Lua 5.2.4模块

c - 从 C 代码控制 shell?

ios - 烦人的警告 : Integer constant not in the range of enumerated type 'UIViewAnimationOptions'

c - 需要未移位的寄存器 - 汇编器在 TST 指令上抛出错误

c - 具有多个设备的板上的 Little 和 Big Endian 访问 - 嵌入式软件架构

c - 我怎样才能简单地在 libtiff 中加载灰度 tiff 并获得像素强度数组?