为什么我的代码不能停止?使用fscanf
我想继续读取文件,直到它结束,但它输出错误答案,无法停止。 我的代码是:为什么我的代码不能停止?使用fscanf,c,C,我想继续读取文件,直到它结束,但它输出错误答案,无法停止。 我的代码是: #include <stdio.h> #include <stdlib.h> void create() { FILE *fin = fopen("in", "r"); int temp[4], t; int aaa; while ((aaa = scanf(fin, "%d:%d:%d:%d/%d",
#include <stdio.h>
#include <stdlib.h>
void create() {
FILE *fin = fopen("in", "r");
int temp[4], t;
int aaa;
while ((aaa = scanf(fin, "%d:%d:%d:%d/%d",
&temp[0], &temp[1], &temp[2], &temp[3], t)) != EOF) {
printf("%d\n", aaa);
printf("%d:%d:%d:%d\n", temp[0], temp[1], temp[2], temp[3]);
}
fclose(fin);
}
int main() {
create();
return 0;
}
但它输出:
0
103:0:0:0
0
103:0:0:0
0
103:0:0:0
....(loop)
fscanf
应该在%d
之间具有
而不是:
,因为这会导致不匹配李>
&t
而不是t
。参见man fscanf
while(fscanf()!=EOF)
表示即使出现任何匹配失败,并且fscanf
未能匹配和存储所有5个参数(由于:
和
不匹配),也要继续循环。您应该使用
while(fscanf()==5)
仅当fscanf
的所有5个参数都匹配并存储时才继续循环您的代码有几个问题:
- 您为最后一个格式说明符传递
而不是其地址t
,调用未定义的行为&t
- 格式字符串使用
而不是:
作为分隔符,导致解析失败
返回它成功解析的字段数。只有在文件结束时,若并没有字段可以被解析,它才会返回fscanf
。否则,如果输入流中有与格式不匹配的字符,它将停止并返回格式字符串的EOF
和0
。例如,输入流中的5
将导致您的
循环永远继续,并返回while
,因为0
与
不匹配这解释了您观察到的当前行为%d
while ((aaa = fscanf(fin, "%d.%d.%d.%d/%d",
&temp[0], &temp[1], &temp[2], &temp[3], &t)) == 5) {
printf("%d\n", aaa);
printf("%d:%d:%d:%d\n", temp[0], temp[1], temp[2], temp[3]);
}
如果要从
文件*
句柄读取,则需要使用fscanf()
而不是scanf()
例如,将fin
作为文件*
在此处:
while (fscanf(fin, "%d:%d:%d:%d/%d",
&temp[0], &temp[1], &temp[2], &temp[3], &t) != EOF) { ... }
将
fscanf()
与5进行比较,而不是EOF
。请不要从注释和答案中建议的修复中更正代码,这会导致不一致。
while (fscanf(fin, "%d:%d:%d:%d/%d",
&temp[0], &temp[1], &temp[2], &temp[3], &t) != EOF) { ... }