你如何制作一个文件,但只有它不存在?喜欢..我想读一个文本文件,但如果它不存在,我想用一些默认文本创建一个。
我可以使用默认文本轻松创建文件。如果它已经存在,我可以追加或覆盖它。
但如果它已经包含一些文本,我想从中读取它。不写信给它。就像您可能使用点文件或配置文件一样,在文件丢失的情况下设置默认配置。
这对Python来说非常简单,但我正在尝试向C过渡,而且它比我预期的更具挑战性。
所以到目前为止我的功能基本上看起来像这样。该文本只是一个占位符,无论真实文本是什么。
main() {
FILE *fp;
fp = fopen("./filename.txt", "w");
fprintf(fp, "some default text\n");
fclose(fp);
}
所以只是为了澄清:如果./file.txt
已经存在,那就不应该写了。应该从中读取。
当我说“读取”时,它可以打印到stdout
,或者存储在数组中,但这可能超出了问题的范围。
考虑到您的示例,有两个主要错误:
fopen
的结果,因此您不知道您的文件是否已成功打开(这是答案的关键)。printf
来打印到你的配置文件。我建议如下:尝试stdout
您的配置文件(例如fprintf
)为fopen
并检查此调用的结果。成功完成后,./filename.txt
会将r
指针返回到您现有的配置文件。如果文件不存在,fopen
返回FILE
,errno设置为fopen
。在这种情况下,您可以创建新的配置文件并在其中写入默认配置。
有关相应的文档,请参阅NULL
部分。
UPD:
这是该提案的PoC
ENOENT
在打开文件之前使用man 3
。如果stat成功则文件存在,如果不存在,则检查errno中的ENOENT。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
FILE *fp = fopen(".rc", "r");
if (!fp)
switch (errno) {
case ENOENT:
fprintf(stderr, "No config found, creating the default one\n");
fp = fopen(".rc", "w");
if (!fp) {
perror("Failed to create default config: ");
return EXIT_FAILURE;
}
/* write default config here */
break;
default:
perror("Failed to open existing config: ");
return EXIT_FAILURE;
}
/* read existing config here */
return EXIT_SUCCESS;
}
请享用 :)