【问题标题】:How to check fscanf errors in C如何检查 C 中的 fscanf 错误
【发布时间】:2012-03-11 12:50:17
【问题描述】:

我有一张这样的桌子;

01 01 02 00 01 02 00 01
01 02 00 01 02 00 01 02
02 00 11 04 04 04 04 04
00 01 10 03 03 03 03 03

我正在阅读这样的文件:

FILE *map = open_file("lazy.map");
if (map == 0)
    return 0;

for (i = 0; i < TOTAL_TILES; ++i) {
    int ttype;
    fscanf(map,"%i",&ttype);
    // do other stuff here...
}

有没有办法检查 fscanf 是否失败?

【问题讨论】:

    标签: c file-io error-handling scanf


    【解决方案1】:

    检查返回值。

    另一种选择是使用%n 格式:

    int n = -1;
    int ttype;
    fscanf(map, "%i%n", &ttype, &n);
    if(-1 == n)
        // failed to parse
    

    这样您可以检查fscanf 消耗了多少符号。上面没有区别,但在:

    int count = fscanf(map, "%i abc %n", &ttype, &n);
    

    count 可能大于一,即使 abc 部分格式不匹配。另一方面,n 只有在整个格式匹配时才会被设置。

    【讨论】:

      【解决方案2】:

      是的:您可以检查它的返回值。每http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html

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

      (该页面标记最后一部分,“并且 errno 应设置为指示错误”,因为它是 POSIX 特定的,这意味着 C 标准本身不需要 errno 被设置;但其余的都是 C 标准所要求的。)

      【讨论】:

        【解决方案3】:

        是的。来自C++ reference

        返回值

        成功时,函数返回项目数 成功读取。这个计数可以匹配预期的数量 在匹配失败的情况下读数或更少 - 甚至为零。在 在任何数据成功之前输入失败的情况 读取,返回EOF。

        【讨论】:

          猜你喜欢
          • 2011-08-13
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          • 2017-11-09
          • 2017-03-29
          • 2015-02-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多