2012-04-13 22 views
4

我不知道为什么一个文件指针从文件中读取一个额外的行,特别是最后一行,这里是代码:读一个C文件,多读一行,为什么?

FILE *fp ; 
fp = fopen ("mac_ip.txt", "r") ; 
int mac; 
char *ip = (char *) malloc(15); 

while(!feof(fp)){ 
    fscanf(fp,"%i",&mac); 
    fscanf(fp,"%s",ip); 

    printf("MAC: %i\n",mac); 
    printf("IP: %s\n",ip); 
} 

和文件恰好有20条线,但线20条,打印两次。

这是哪个错误?

在此先感谢。

+0

解决了,感谢@NeilTownsend – 2012-04-13 13:12:46

+0

勿投的malloc的返回类型(看[这里](HTTP ://stackoverflow.com/q/605845/1151654)知道为什么)。 – Eregrith 2012-04-13 13:33:57

回答

2

在完成了第二十行的两次读取之后,您已经到了文件末尾但是系统不知道这一点。 feof只会在你试图超越文件末尾时才会触发,而不是当你刚好在它上面时...

另外,你可能在第20行有一个行尾(CR或CR-LF)它只会通过另一次尝试阅读而过去。

解决方案是一次性读取该行(为此具有特定的C命令),然后解析该行以获取数据。如果全线阅读失败,那么你已经到了最后。

+0

好的,这个解释让我想起了。解决了。 – 2012-04-13 13:10:04

+1

你也可以只做(fscanf(fp,“%i%s”,&mac,ip)== 2)printf(...):) – svinja 2012-04-13 13:12:39

+0

是的,不错的选择。 – 2012-05-10 18:31:10

6

因为读完最后两个值后,仍然没有命中EOF。所以循环继续。在循环的下一个循环中,fscanf实际上并没有像第二次读取最后一行那样,fscanfs失败,但printfs输出循环的前一个循环中的值。

5

feof不知道它在文件的末尾,直到您尝试阅读更多。由于fscanf告诉你有多少项目是有,你可以使用这个简单的一招:

for(;;){ 
    if (fscanf(fp,"%i%s", &mac, ip) != 2) break; 
    printf("MAC: %i\n",mac); 
    printf("IP: %s\n",ip); 
} 
+0

非常感谢,你让我的主意。现在它是完美的。谢谢;) – 2012-04-13 13:11:27

+0

fscanf()在EOF上返回-1,其值为true。 – wildplasser 2012-04-13 13:16:03

+0

@wildplasser谢谢,现在已修复。 – dasblinkenlight 2012-04-13 13:27:49

0

您更好的测试打印结果之前的fscanf返回值。我敢打赌,在循环的最后一次迭代中,fscanf调用失败,并打印上次返回的结果。

0
FILE *fp ; 
int mac; 
char ip[15]; 

fp = fopen ("mac_ip.txt", "r") ; 
if (!fp) return; 

while(1){ 
    if (fscanf(fp,"%i",&mac) < 1) break; 
    if (fscanf(fp,"%s",ip) < 1) break; 

    printf("MAC: %i\n",mac); 
    printf("IP: %s\n",ip); 
} 
fclose (fp); 

fscanf()返回它分配的数量mad(或者eof上的-1)。通过使用返回值,您不需要eof()函数。顺便说一句,我不认为你可以读取一个MAC地址到一个int。也许你需要将它读入一个字符串呢?

说明:feof()不执行OP所期望的操作。 feof()应该只在其中一个文件操作失败后才被检查。在大多数情况下,您不需要feof()。

1

您的代码类似于下面的示例

#include <stdio.h> 

int main(void) 
{ 
    char buffer[256]; 
    FILE * myfile; 

    myfile = fopen("some.txt","r"); 

    while (!feof(myfile)) 
    { 
     fgets(buffer,256,myfile); 
     printf("%s",buffer); 
    } 

    fclose(myfile); 

    return 0; 
} 

http://www.friedspace.com/feof.html