11

fscanf 在读取文件中的数据时返回什么。例如,

int number1, number2, number3, number4, c;

c = fscanf (spFile, "%d", &number1);
//c will be 1 in this case.

c = fscanf (spFile, "%d %d %d %d", &number1, &number1, &number3, &number4);
//in this case, c will return 4.

我只想知道为什么它会根据参数的数量返回这样的值。

4

5 回答 5

15

Xscanf 系列函数的手册页:

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

因此,您的第一次调用fscanf返回 1,因为一个输入项 ( &number1) 已与格式说明符成功匹配%d。您的第二次调用fscanf返回 4,因为所有 4 个参数都匹配。

于 2013-03-10T02:54:55.087 回答
3

我从cplusplus.com引用。

成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。

如果发生读取错误或读取时到达文件结尾,则设置正确的指示符(feof 或 ferror)。并且,如果在任何数据可以成功读取之前发生任何一种情况,则返回 EOF。

- 编辑 -

如果您打算确定读取到字符串的字节数。

int bytes;
char str[80];
fscanf (stdin, "%s%n",str,&bytes);
printf("Number of bytes read = %d",bytes);
于 2013-03-10T02:57:30.593 回答
1

返回值不取决于参数的数量fscanf,它取决于成功扫描的值的数量fscanf

于 2013-03-10T03:49:47.427 回答
1

这恰好是一个非常直截了当的问题,查尔斯和埃德在我之前已经恰当地回答了。但是他们没有提到下次遇到困难时应该在哪里寻找这些东西。

首先是问题 - fscanf 属于格式化输入(扫描)函数系列,它们应该读取输入并报告读取的数据的一些信息,如字节或获得适当输入读取的项目(变量地址)计数并已成功分配。

这里 fscanf 应该使用函数调用中提供的格式字符串检查输入文件中的匹配项,并相应地分配(按其位置顺序)变量 - 具有值的地址,一旦完成,它将返回总计数它所做的成功分配的数量。因此 1 和 next 的结果是 4 (假设输入正确提供)。

第二部分:去哪里看?-- 如果您参考手册页或 posix 文档,可以轻松找到此类功能的详细描述。

如果您注意到,前两个答案还包含从手册页中摘录的少量内容。

希望这可以帮助。

于 2013-03-10T03:22:24.183 回答
1

手册页:

*这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,如果早期匹配失败,甚至为零。*

因此,如果能够从文件中读取一个整数,则第一个返回 1,如果能够从文件中读取 4 个整数,则第二个返回 4。

于 2013-03-10T02:56:15.940 回答