2

If the contents of a file do not match the format string passed to fscanf, what happens on the next call to fscanf?

Suppose a file contains the following two lines:

9000 pig dog
4 5 2

A program tries to parse the opened file (fp) as such:

int a = 1, b = 1, c = 1;
int x = 1, y = 1, z = 1;

fscanf(fp, "%d %d %d", &a, &b, &c);
fscanf(fp, "%d %d %d", &x, &y, &z);

I suspect that a would now hold 9000 while b and c continue to hold the value 1 -- but what happens to x, y, and z?

Does the C99 standard guarantee that x, y, and z will hold the values 4, 5, and 2 respectively -- or is the file stream's position indicator guaranteed to be left unmodified after a failed parse, causing x to hold the value 9000 while y and z hold on to the value 1?

4

2 回答 2

3

第 7.19.6.2 节

4)fscanf函数依次执行格式的各个指令。如果指令失败,如下所述,函数返回。失败被描述为输入失败(由于发生编码错误或输入字符不可用)或匹配失败(由于输入不当)。

5) 由空白字符组成的指令通过读取输入执行,直到第一个非空白字符(仍然未读取),或者直到无法读取更多字符。

9) 从流中读取输入项,除非规范中包含说明n符。输入项被定义为输入字符的最长序列,它不超过任何指定的字段宽度,并且是匹配输入序列的前缀或匹配输入序列的前缀。输入项之后的第一个字符(如果有)保持未读状态。

所以a将是 9000,b并且c继续为 1。流被读取到(但不包括)pig,因此%d第二个调用中的第一个立即失败,导致x,yz保持为 1。

于 2013-07-23T17:29:17.503 回答
0

从我方便的 Plauger 和 Brodie 的“Standard C”副本中总结,fscanf() 返回...

  • 格式字符串的结尾
  • EOF 存档
  • 转换失败

关于对话失败,没有明确说明,但我认为失败的角色被推回了流中。所以你的“p”字符会在流中。

请注意,fscanf() 的返回值是匹配的输入项的数量。因此,对您而言,每次成功将是 3 的回报。在您的示例中,我希望返回 1 和 0。

于 2013-07-23T17:25:35.317 回答