4

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

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 行打印了两次。

哪个是错误?

提前致谢。

4

6 回答 6

6

因为在阅读了最后两个值之后,您仍然没有达到 EOF。所以循环继续。在循环的下一次循环中,fscanf 实际上并没有像它出现的那样第二次读取最后一行,fscanfs 失败,但 printfs 打印出循环前一次循环的值。

于 2012-04-13T13:06:28.637 回答
5

feof在您尝试阅读更多内容之前,不会“知道”它位于文件末尾。因为fscanf告诉你它有多少项目,你可以使用这个简单的技巧:

for(;;){
    if (fscanf(fp,"%i%s", &mac, ip) != 2) break;
    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}
于 2012-04-13T13:07:34.303 回答
2

在您完成第 20 行的两次读取后,您已经到了文件的末尾,系统不知道这一点。feof 只会在您尝试越过文件末尾时触发,而不是在您完全位于文件末尾时触发...

此外,您可能在第 20 行有一个行尾(CR 或 CR-LF),它只会在再次尝试读取时通过。

解决方案是一口气读取该行(为此有一个特定的 C 命令),然后解析它以获取您的数据。如果整行读取失败,那么你已经走到了尽头。

于 2012-04-13T13:06:46.240 回答
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

于 2012-04-13T13:25:45.147 回答
0

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

于 2012-04-13T13:09:59.483 回答
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() 返回它疯狂的赋值数(或 eof 上的 -1)。通过使用返回值,您不需要 eof() 函数。顺便说一句,我认为您不能将 MAC 地址读入 int。也许您也需要将其读入字符串?

说明: feof() 不符合 OP 的预期。feof() 仅应在文件操作之一失败后检查。在大多数情况下,您不需要 feof()。

于 2012-04-13T13:10:04.093 回答