c - 检查文件是否存在后更改 fopen 模式的正确方法是什么?
问题描述
在我的程序中,我想检查一个日志文件是否已经存在,然后将一些数据写入其中。因此,我首先以“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 */
}
推荐阅读
- javascript - 数组推送不起作用 foreach javacsript
- c# - 从枚举值获取对象类型
- javascript - FirebaseError:使用无效数据调用函数 Query.where()。不支持的字段值:在 next.js 中未定义
- javascript - 有没有办法在使用 Discord 创建角色时删除权限?
- laravel - 如何用 phpunit 模拟 Laravel Eloquent 模型?
- visual-studio - VS2022 停止分析器
- python - 如何按索引数组对数组进行排序?
- vue.js - 双击丢失查询字符串
- python - 在输入中找到十六进制字符串在mac中读取python3工作,在ubuntu中失败
- r - 折叠具有重复 ID 的行和所有其他变量的平均值