[英]C binary file reading
我在读取二进制文件时遇到了一些问题,而最后一条记录被重读了两次。 我输入了4条记录,但是打印了5条记录,始终打印了两次打印的最后一条记录。
int main ()
{
FILE *fp;
fp = fopen( "file" , "a+" );
struct clientsData {int num1; int num2; char str[20]; };
if (getchar()=='w')
{
int n1,n2;
char name[20];
scanf("%d",&n1);
scanf("%d",&n2);
scanf("%s",name);
struct clientsData client;
client.num1=n1;
client.num2=n2;
strncpy(client.str,name, 20);
fwrite(&client , 1, sizeof(struct clientsData) , fp );
}
else
{
while (!feof(fp))
{
struct clientsData client;
fread(&client, 1, sizeof(struct clientsData) , fp);
printf("%d\t%d\t%s\n",client.num1, client.num2, client.str);
}
}
fclose(fp);
return(0);
}
输出:
1 1 asd
2 3 asd
23 90 player
23 23 marin
23 23 marin
这个问题源于feof
工作方式。 如果超出文件限制,则返回true(如果您尝试读取最后一个字符后的内容)。 所以,你的程序目前的工作方式是:读取最后一个有效数据并打印它,尝试再次读取数据(fread失败,数据结构内容相同,打印它(你获得相同的输出),feof返回现在是,因为你试图读过文件的末尾,所以循环结束。
正确的方法是:
struct clientsData client;
while (fread(&client, 1, sizeof(struct clientsData) , fp) == sizeof(struct clientsData))
{
printf("%d\t%d\t%s\n",client.num1, client.num2, client.str);
}
请注意,这也更有效,因为您不会调用feof。
feof()仅在尝试读取文件末尾后返回true; 检查来自fread的返回值以确保它实际返回数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.