为什么我的代码无法停止?使用fscanf

时间:2016-01-06 15:53:16

标签: 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", 
                      &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)

3 个答案:

答案 0 :(得分:1)

  1. fscanf .应该:而不是%d &t导致不匹配。
  2. 同时使用t代替man fscanf。请参阅while(fscanf() != EOF)
  3. 同样fscanf表示即使发生任何匹配的失败并且:无法匹配并存储所有5个参数(由于.while(fscanf() == 5)不匹配而在此处发生)然后继续循环。
    只有当fscanf的所有5个参数都匹配并存储时,才应使用{{1}}继续循环。

答案 1 :(得分:0)

您的代码存在一些问题:

  • 为最后一个格式说明符传递t而不是其地址&t,从而调用未定义的行为。

  • 格式字符串使用:而不是.作为分隔符,导致解析失败。

  • fscanf返回成功解析的字段数。仅在文件结束时,如果无法解析字段,则返回EOF。否则,如果输入流中的某个字符与格式不匹配,则会停止并在05之间为您的格式字符串返回。例如,输入流中的.将导致while循环继续fscanf返回0,因为.不匹配{ {1}}。 这解释了您观察到的当前行为

您应该将测试更改为:

%d

答案 2 :(得分:0)

如果您想阅读FILE *句柄,则需要使用fscanf()代替scanf()

例如,finFILE *

while (fscanf(fin, "%d:%d:%d:%d/%d",
              &temp[0], &temp[1], &temp[2], &temp[3], &t) != EOF) { ... }