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