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

如果文件的内容与传递给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现在会持有9000bc继续保持值1 – 但是xyz会发生什么?

C99标准是否保证xyz保持值42 – 或者文件流的位置指示器保证在解析失败后保持不变,导致x保持值9000yz保持值1

第7.19.6.2节

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

5)由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。

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

因此a将是9000并且bc继续为1.流被读取(但不包括) pig ,因此第二次调用的第一个%d立即失败,导致xyz保持为1。

总结来自Plauger和Brodie的“标准C”的便利副本,fscanf()返回…

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

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

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