首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取配置文件,或在缺少配置文件时创建配置文件

如何读取配置文件,或在缺少配置文件时创建配置文件
EN

Stack Overflow用户
提问于 2019-03-20 09:05:58
回答 2查看 562关注 0票数 1

如何创建一个文件,但前提是它还不存在?就像..。我想读取一个文本文件,但是如果它不存在,我想要创建一个带有默认文本的文本文件。

我可以很容易地用默认文本创建文件。如果它已经存在,我可以追加或覆盖它。

但是如果它已经包含了一些文本,我想从中读一读。而不是写信给它。就像处理点文件或配置文件一样,在文件丢失的情况下设置默认配置。

这在Python中非常简单,但我正在尝试向C转换,这比我预期的更具有挑战性。

到目前为止,我的功能基本上是这样的。文本只是一个占位符,无论真正的文本可能是什么。

代码语言:javascript
复制
main() {
    FILE *fp;

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

因此,我只想澄清一下:如果./file.txt已经存在,就不应该写到。它应该是从。

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

EN

回答 2

Stack Overflow用户

发布于 2019-03-20 09:33:35

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

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

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

有关相应的文档,请参见man 3部分。

UPD

这是PoC的提议

代码语言:javascript
复制
#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;
}
票数 4
EN

Stack Overflow用户

发布于 2019-03-20 09:48:05

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

示例

代码语言:javascript
复制
#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.
    }
}

享受:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55257043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档