【问题标题】:Using fopen with input filenames in C在 C 中使用 fopen 和输入文件名
【发布时间】:2016-04-14 22:24:21
【问题描述】:

在我的代码中,我想读取我将要创建(和/或编辑)的文件的名称,我想出了以下内容:

FILE *fp;
char filename[15];
fgets(filename, 15, stdin);
fp = fopen(filename, "a");
fprintf(fp, "some stuff goes here");
fclose(fp);

即使编译并运行,它也不会创建(或打开,如果我手动创建它)filename 指定的文件。
你有什么建议?

【问题讨论】:

  • 您确定要在正确的位置查找文件吗?还要在打开它后检查 fp == NULL 是否。如果它为 NULL,则意味着打开它时出错。使用 perror 函数获取错误信息。

标签: c string file fopen


【解决方案1】:

fgets() 存储在读取一行输入后从stdin 读取的换行符。您需要手动剥离它,例如

size_t len = strlen(filename);
if (len > 0 && filename[len - 1] == '\n')
    filename[len - 1] = '\0';

您还应该检查fopen() 没有返回NULL,如果它无法打开文件,它将执行此操作。我认为将fprintfNULL 文件指针一起使用是未定义的行为。

【讨论】:

    【解决方案2】:

    通常(但不总是),fgets() 会给你一个额外的'\n' 附加输入的字符串,因为

    换行符使 fgets 停止读取,但它被认为是 函数的有效字符并包含在复制到的字符串中 字符串。

    参考:http://www.cplusplus.com/reference/cstdio/fgets/

    使用最少的代码摆脱'\n'

    fgets(filename, 15, stdin);
    filename[strcspn(filename, "\n")] = '\0';
    

    【讨论】:

      【解决方案3】:

      您需要声明 filename[16] 才能使用 15 个字符,您需要为终止零留出空间。

      【讨论】:

        【解决方案4】:

        由于 fgets 将读取字符串 util 一个 EOF 或换行符,如果读取了换行符,则将其存储到缓冲区中。这意味着您必须手动修剪结束换行符(如果有)。我建议改用 fscanf,它不会将换行符添加到缓冲区:

        char filename[15];
        int ret = fscanf(stdin, "%s", filename);
        if (ret != 1) { // handle input error }
        fp = fopen(filename, "a");
        

        【讨论】:

        • 这不会将换行符读入缓冲区,但不会处理带空格的文件名。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2018-03-27
        • 2016-10-06
        • 2011-12-24
        相关资源
        最近更新 更多