【问题标题】:c fscanf error checkingc fscanf 错误检查
【发布时间】:2011-08-13 06:12:30
【问题描述】:

我正在使用 fscanf 从 C 中的文件中读取数据。我只是想知道我是否正确检查了所有错误条件,这是最可靠的方法,我没有遗漏任何内容。

FILE* fp;
char filename[] = "untitled";
int count;

char item1[1025];
char item2[1025];


fp = fopen(filename, "r");
if (fp == NULL) {
    perror("fopen");
    return -1;
}

count = fscanf(fp, "%1024s%1024s", item1, item2);
if (count == EOF) {
    if (ferror(fp)) {
        perror("fscanf");
    }
    else {
        fprintf(stderr, "Error: fscanf matching failure\n");
    }
    return -1;
}
else if (count == 0) {
    fprintf(stderr, "Error: fscanf early matching failure\n");
    return -1;
}
else if (count != 2) {
    fprintf(stderr, "Error: fscanf matched less items than expected\n");
    return -1;
}

if (fclose(fp) == EOF) {
    perror("fclose");
    return -1;
}

感谢您的宝贵时间。

在 cmets 之后编辑:

count = fscanf(fp, "%1024s%1024s", item1, item2);
if (count == EOF) {
    if (ferror(fp)) {
        perror("fscanf");
    }
    else {
        fprintf(stderr, "Error: fscanf reached end of file, no matching characters, no matching failure\n");
    }
    return -1;
}
else if (count != 2) {
    fprintf(stderr, "Error: fscanf successfully matched and assigned %i input items, 2 expected\n", count);
    return -1;
}

【问题讨论】:

    标签: c error-handling scanf


    【解决方案1】:

    scanf 不会在“匹配失败”时返回 EOF。它仅在“输入失败”(EOF、读取错误或编码错误)时返回EOF,并且仅当输入失败发生在任何成功的转换和分配之前。因此,如果返回值为EOF,则ferrorfeof 必须返回非零值。

    【讨论】:

    • @R:我很难按照 fscanf 的手册页进行操作。我想我误解了标题返回值下的第一行。
    • 是的,这很令人困惑。其实我昨天刚问了这个问题..
    • 那么 fscanf 可以在不设置错误指示器的情况下返回 EOF 吗?手册页似乎暗示只有在发生读取错误时才设置它?
    • 如果在任何转换之前到达文件末尾,它也可以返回EOF,在这种情况下feof将被设置。
    • @R:所以 feof 仅在到达文件末尾时才设置(任何转换或找到匹配错误)。如果它成功匹配整个文件则不是?
    【解决方案2】:
    else if (count == 0) {
        fprintf(stderr, "Error: fscanf early matching failure\n");
        return -1;
    }
    else if (count != 2) {
        fprintf(stderr, "Error: fscanf matched less items than expected\n");
        return -1;
    }
    

    经不起可用性的考验。这些情况无法通过错误消息进行区分;如果您必须向用户报告这两个选项,那为什么不呢

    if (count != NMATCHES)
        fprintf(stderr, "Error: wanted %d items, found %d\n", NMATCHES, count);
    

    【讨论】:

      【解决方案3】:
      1. 您的 fscanf 仅在您使用具有相同 %1024s%1024s 的 fprintf 时才有效,否则我认为您无法获取两个 char 变量中的字符串。

      2. 你将你的代码限制为 1K 的大小,你不应该使用硬编码值,如果你的字符串大小超过 1K(极端情况)你会怎么做,所以你必须限制你的字符串文件中的大小小于 1K,除非您可以控制将数据写入同一个文件,否则您不能每次都期望。

      【讨论】:

      • 在这种情况下,我确实可以控制文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 2015-02-09
      • 1970-01-01
      • 2017-11-09
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多