fscanf的返回值是什么?

13

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.

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

5个回答

16

以下内容来自于Xscanf函数族的man手册:

当函数成功完成时,它们将返回成功匹配和分配输入项的数量; 如果在早期匹配失败的情况下数量为零。如果输入在第一个匹配失败或转换之前结束,则返回EOF。如果发生读取错误,则设置流的错误指示器,返回EOF,并设置errno以指示错误。

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


编译器在第一次匹配失败时是否会打印EOF?即printf(“%d”,c); - slow
1
如果在匹配任何参数之前fscanf失败,它将返回EOF。在C中,EOF是一个实现定义的值,您可以使用宏EOF进行测试。因此,您可以说if c == EOF { /* do something */ }来检查返回值c - Charles Salvia
1
+1 EOF 返回值对我的问题有效。我想从stdio中读取文本文件,然后将其内容写入终端。while (fscanf(stdin, "%s", buf)!=EOF){ printf("value read: [%s]\n", buf); } - EsmaeelE

3
我引用自cplusplus.com
成功时,函数返回已填充参数列表的项目数量。此计数可以匹配预期的项目数量,也可以由于匹配失败、读取错误或到达文件结尾而少(甚至为零)。
如果发生读取错误或到达文件结尾,则设置适当的指示器(feof或ferror)。如果在成功读取任何数据之前发生任何一个,将返回EOF。
--编辑--
如果您的意图是确定读入字符串的字节数。
int bytes;
char str[80];
fscanf (stdin, "%s%n",str,&bytes);
printf("Number of bytes read = %d",bytes);

1

来自手册页面:

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

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


1
这是一个非常直接的问题,charles和ed在我之前已经很好地回答了它。但他们没有提到下一次卡住时应该去哪里寻找这些内容。
首先是问题 - fscanf属于格式化输入(扫描)函数系列,用于读取输入并报告有关读取的数据的一些信息,例如字节数或成功分配的项目数(变量地址)的计数。
在这里,fscanf应该检查输入文件中与函数调用中提供的格式字符串匹配的内容,并相应地将(按其位置顺序)变量地址赋值为值,完成后将返回成功分配的总数。因此,假设输入正确,则结果为1和4。
第二部分:在哪里寻找? - 这样的函数的详细描述在您的手册页面或posix文档中很容易找到。
如果您注意到,前两个答案也包含来自手册页面的小节落。
希望这可以帮助您。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接