读一个C文件,读一个额外的行,为什么?

Joe*_*wis 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);  
}
Run Code Online (Sandbox Code Playgroud)

并且文件正好有20行,但是第20行打印了两次.

哪个错误?

提前致谢.

svi*_*nja 6

因为在阅读了最后两个值后,您仍然没有按下EOF.所以循环继续.在循环的下一次传递中,fscanf实际上不会像第二次那样读取最后一行,fscanfs会失败,但printfs会打印出上一次循环传递的值.


das*_*ght 5

feof在您尝试阅读更多内容之前,它不会"知道"它在文件的末尾.既然fscanf告诉你它有多少项,你可以使用这个简单的技巧:

for(;;){
    if (fscanf(fp,"%i%s", &mac, ip) != 2) break;
    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}
Run Code Online (Sandbox Code Playgroud)