如何读取配置文件,或者如果缺少配置文件则创建一个

问题描述 投票:2回答:2

你如何制作一个文件,但只有它不存在?喜欢..我想读一个文本文件,但如果它不存在,我想用一些默认文本创建一个。

我可以使用默认文本轻松创建文件。如果它已经存在,我可以追加或覆盖它。

但如果它已经包含一些文本,我想从中读取它。不写信给它。就像您可能使用点文件或配置文件一样,在文件丢失的情况下设置默认配置。

这对Python来说非常简单,但我正在尝试向C过渡,而且它比我预期的更具挑战性。


所以到目前为止我的功能基本上看起来像这样。该文本只是一个占位符,无论真实文本是什么。

main() {
    FILE *fp;

    fp = fopen("./filename.txt", "w");
    fprintf(fp, "some default text\n");
    fclose(fp);
}

所以只是为了澄清:如果./file.txt已经存在,那就不应该写了。应该从中读取。

当我说“读取”时,它可以打印到stdout,或者存储在数组中,但这可能超出了问题的范围。

c file condition fopen race-condition
2个回答
4
投票

考虑到您的示例,有两个主要错误:

  1. 您不检查fopen的结果,因此您不知道您的文件是否已成功打开(这是答案的关键)。
  2. qazxsw poi函数直接打印到qazxsw poi,你必须使用printf来打印到你的配置文件。

我建议如下:尝试stdout您的配置文件(例如fprintf)为fopen并检查此调用的结果。成功完成后,./filename.txt会将r指针返回到您现有的配置文件。如果文件不存在,fopen返回FILE,errno设置为fopen。在这种情况下,您可以创建新的配置文件并在其中写入默认配置。

有关相应的文档,请参阅NULL部分。

UPD:

这是该提案的PoC

ENOENT

0
投票

在打开文件之前使用man 3。如果stat成功则文件存在,如果不存在,则检查errno中的ENOENT。

Example

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

请享用 :)

© www.soinside.com 2019 - 2024. All rights reserved.