如何创建一个文件,但前提是它还不存在?就像..。我想读取一个文本文件,但是如果它不存在,我想要创建一个带有默认文本的文本文件。
我可以很容易地用默认文本创建文件。如果它已经存在,我可以追加或覆盖它。
但是如果它已经包含了一些文本,我想从中读一读。而不是写信给它。就像处理点文件或配置文件一样,在文件丢失的情况下设置默认配置。
这在Python中非常简单,但我正在尝试向C转换,这比我预期的更具有挑战性。
到目前为止,我的功能基本上是这样的。文本只是一个占位符,无论真正的文本可能是什么。
main() {
FILE *fp;
fp = fopen("./filename.txt", "w");
fprintf(fp, "some default text\n");
fclose(fp);
}因此,我只想澄清一下:如果./file.txt已经存在,就不应该写到。它应该是从。
当我说"read“时,它可以打印到stdout,或者存储在数组中,但这可能超出了问题的范围。
发布于 2019-03-20 09:33:35
考虑到您的例子,有两个主要错误:
fopen的结果,因此不知道您的文件是否已被成功打开(这是答案的关键)。printf函数直接打印到stdout,您必须使用fprintf函数将其打印到配置文件。我建议如下:尝试将您的配置文件(例如,fopen )用于r,并检查此调用的结果。成功完成后,fopen将返回指向现有配置文件的FILE指针。如果文件不存在,fopen将返回NULL,并将errno设置为ENOENT。在这种情况下,您可以创建一个新的配置文件并将默认配置写入其中。
有关相应的文档,请参见man 3部分。
UPD
这是PoC的提议
#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;
}发布于 2019-03-20 09:48:05
在打开文件之前使用状态。如果stat成功,则文件存在,如果不存在,请在errno中检查ENOENT。
示例
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
struct stat file_infos;
char file_path[] = "/whatever"
if (stat(file_path, &file_infos) != 0)
{
if (errno == ENOENT)
{
// Do whatever when the file wasn't found
}
else
{
// Error accessing the file, check the errno for more infos
}
}
else
{
// File exists, do whatever you like with it.
}
}享受:)
https://stackoverflow.com/questions/55257043
复制相似问题