我想继续读取文件直到它结束,但它输出错误答案并且无法停止。 我的代码是:
#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;
}
我的输入文件内容是:
103.29.43.0/24
103.29.5.0/24
103.29.52.0/22
103.29.56.0/22
103.29.60.0/22
103.2.96.0/22
103.29.64.0/24
103.29.65.0/24
103.29.66.0/24
103.29.67.0/24
103.29.7.0/24
但输出:
0
103:0:0:0
0
103:0:0:0
0
103:0:0:0
....(loop)
答案 0 :(得分:1)
fscanf
.
应该:
而不是%d
&t
导致不匹配。 t
代替man fscanf
。请参阅while(fscanf() != EOF)
fscanf
表示即使发生任何匹配的失败并且:
无法匹配并存储所有5个参数(由于.
和while(fscanf() == 5)
不匹配而在此处发生)然后继续循环。fscanf
的所有5个参数都匹配并存储时,才应使用{{1}}继续循环。答案 1 :(得分:0)
您的代码存在一些问题:
为最后一个格式说明符传递t
而不是其地址&t
,从而调用未定义的行为。
格式字符串使用:
而不是.
作为分隔符,导致解析失败。
fscanf
返回成功解析的字段数。仅在文件结束时,如果无法解析字段,则返回EOF
。否则,如果输入流中的某个字符与格式不匹配,则会停止并在0
和5
之间为您的格式字符串返回。例如,输入流中的.
将导致while
循环继续fscanf
返回0
,因为.
不匹配{ {1}}。 这解释了您观察到的当前行为。
您应该将测试更改为:
%d
答案 2 :(得分:0)
如果您想阅读FILE *
句柄,则需要使用fscanf()
代替scanf()
。
例如,fin
为FILE *
:
while (fscanf(fin, "%d:%d:%d:%d/%d",
&temp[0], &temp[1], &temp[2], &temp[3], &t) != EOF) { ... }