格式与文件内容不匹配时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
现在会持有9000
而b
和c
继续保持值1
– 但是x
, y
和z
会发生什么?
C99标准是否保证x
, y
和z
保持值4
和2
– 或者文件流的位置指示器保证在解析失败后保持不变,导致x
保持值9000
而y
和z
保持值1
?
第7.19.6.2节
4)
fscanf
函数依次执行格式的每个指令。 如果指令失败,如下所述,函数返回。 故障被描述为输入故障(由于出现编码错误或输入字符不可用)或匹配故障(由于输入不当)。5)由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。
9)从流中读取输入项,除非该规范包含
n
指定者。 输入项被定义为输入字符的最长序列,其不超过任何指定的字段宽度,并且是匹配输入序列的前缀或前缀。 输入项目之后的第一个字符(如果有)仍未读取。
因此a
将是9000并且b
和c
继续为1.流被读取(但不包括) pig
,因此第二次调用的第一个%d
立即失败,导致x
, y
和z
保持为1。
总结来自Plauger和Brodie的“标准C”的便利副本,fscanf()返回…
- 格式字符串的结尾
- EOF存档
- 转换失败
在谈话失败时,它没有明确说明,但我认为失败的角色被推回到流上。 所以你的“p”字符将在流上。
请注意,fscanf()的返回值是匹配的输入项的数量。 所以你的成功每次都会回归3。 我希望你的例子中返回1和0。