如何检查C中的fscanf错误

时间:2012-03-11 12:50:17

标签: c file-io error-handling scanf

我有一张这样的桌子;

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是否失败?

3 个答案:

答案 0 :(得分:2)

检查返回值。

另一种选择是使用%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也可能大于1。另一方面,仅当整个格式匹配时才会设置n

答案 1 :(得分:1)

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

  

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

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

答案 2 :(得分:0)

是。来自C++ reference

  

返回值

     

成功时,该函数返回项目数   成功阅读。此计数可以匹配预期的数量   在匹配失败的情况下读数或少于零。在   在任何数据成功之前输入失败的情况   阅读,EOF被退回。