2016-01-06 65 views
1

我想继续读文件直到它结束,但它输出错误答案并且不能停止。 我的代码是:为什么我的代码不能停止?使用fscanf

#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) 
+2

比较'的fscanf()'〜5,而不是'EOF'。 –

+1

请不要在评论和答案中修正所提出的修补程序中的代码,否则会导致不一致。 – chqrlie

回答

0

有几个问题与您的代码:

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

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

  • fscanf返回成功解析的字段数。只有在文件结束时,如果没有字段可以解析,它会返回EOF。否则,如果输入流中的字符与格式不匹配,则停止并在格式字符串的05之间返回。例如,输入流中的.将导致您的while循环永远继续,fscanf将返回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]); 
    } 
1
  1. fscanf应该有.而不是%d之间:为这是造成不匹配。
  2. 也使用&t而不是t。见man fscanf
  3. 此外while(fscanf() != EOF)即使发生任何故障匹配和fscanf不匹配和存储所有5个参数(这是这里发生因:.不匹配),那么也继续循环的意思。
    只有当fscanf的所有5个参数匹配并存储时,才应该使用while(fscanf() == 5)继续循环。
0

如果你想从一个FILE *手柄阅读,您需要使用fscanf()而不是scanf()

例如,作为fin这里FILE *

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