格式与文件内容不匹配时fscanf的行为

时间:2013-07-23 17:14:33

标签: c file-io c99 scanf

如果文件内容与传递给fscanf的格式字符串不匹配,下次调用fscanf时会发生什么?

假设一个文件包含以下两行:

9000 pig dog
4 5 2

程序试图解析打开的文件(fp):

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);

我怀疑a现在9000 bc1继续保持值x - 但{{1}会发生什么},yz

C99 标准是否保证xyz保留45,和2 - 或者是文件流的位置指示符保证在解析失败后保持不变,导致x9000和{{{{}}时保持值y 1}}保持值z

2 个答案:

答案 0 :(得分:2)

  

第7.19.6.2节

     

4) fscanf 函数依次执行格式的每个指令。如果指令失败,则为   详细说明如下,函数返回。故障被描述为输入故障(由于   出现编码错误或输入字符不可用)或匹配   失败(由于输入不当)。

     

5)由白色空格字符组成的指令通过读取输入来执行   第一个非空白字符(仍未读取),或直到没有其他字符可以   请阅读。

     

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

因此a将是9000而bc仍然是1.流被读取(但不包括)pig,因此第一个{{第二次通话的1}}立即失败,导致%dxy保持为1。

答案 1 :(得分:0)

总结我从Plauger和Brodie手中的“标准C”副本,fscanf()返回...

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

在会话失败时,没有明确说明,但我认为失败的字符会被推回到流上。所以你的“p”字符将在流上。

请注意,fscanf()的返回值是匹配的输入项的数量。所以你的成功每次都会回归3。我希望你的例子中返回1和0。