c fscanf错误检查

时间:2011-04-26 17:54:48

标签: c error-handling scanf

我正在使用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;
}

感谢您的时间。

评论后编辑:

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 (count != NMATCHES)
    fprintf(stderr, "Error: wanted %d items, found %d\n", NMATCHES, count);

答案 2 :(得分:-1)

  1. 你的fscanf只有当你使用相同的%1024s%1024s的fprintf时才有效,否则我认为你不能在两个char变量中得到字符串。

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