【问题标题】:Read an inconsistent file读取不一致的文件
【发布时间】:2014-01-20 09:05:29
【问题描述】:

C 中的哪些文件阅读器可以处理读取不一致的文件?有时文件是“字号”,有时只是“字”。像这样。

bob 456
echo
cat 
dog 1101
peacock 300

这是我用 fscanf 尝试过的。我很惊讶它奏效了。我不认为 fscanf 喜欢不一致的文件。有什么我需要担心的吗?我知道如果你不小心, fscanf 会产生非常糟糕的副作用。

while (fscanf(pFile, "%s %d",  nam, &val) !=EOF)
{
    //my work
}

【问题讨论】:

    标签: c file-io scanf


    【解决方案1】:

    您需要仔细阅读fscanf 的文档

    成功完成后,这些函数应返回成功匹配和分配的输入项的数量;如果发生早期匹配失败,此数字可以为零。如果输入在第一次匹配失败或转换之前结束,则返回 EOF。如果发生读取错误,则设置流的错误指示符,返回EOF,并设置errno指示错误。

    我会这样做:

    while (TRUE) {
        int matched = fscanf(pFile, "%s %d", nam, &val);
    
        if (matched == 2) {
            // nam and val are valid
        } else if (matched == 1) {
            // only nam was assigned
        } else {   // Includes EOF case
            // Nothing was assigned
            break;
        }
    }
    

    【讨论】:

    • 你能解释一下我的代码方式发生了什么吗?为什么我没有任何问题?使用 fgetc、fgets 或其他文件阅读器会更好吗?如果不使用 EOF,如何处理空格?
    • @cokedude 我在 EOF 方面误导了你一点。查看我的编辑。
    • @cokedude 我不能——你还没有展示你所有的代码。您如何在while 循环的主体中使用val?很可能,它仍然具有上次调用 fscanf 时的值,因为正如我所说,fscanf 从未分配给它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多