我有一张这样的桌子;
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是否失败?
答案 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被退回。