C 二进制文件读取

C 二进制文件读取,c,C,我在读取二进制文件时遇到了一个小问题,而最后一条记录被读取了两次。 我输入了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

我在读取二进制文件时遇到了一个小问题,而最后一条记录被读取了两次。 我输入了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
的工作方式。如果超出了文件的限制(如果试图读取最后一个字符之后的内容),则返回true。因此,您的程序当前的工作方式是:读取最后一个有效数据并打印它,尝试再次读取数据(fread失败,数据结构的内容相同,打印它(获得相同的输出),feof现在返回true,因为您试图读取文件的结尾,所以循环结束

正确的方法是:

    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。

正如我理解的,当查找eof字符时,再进行一次循环。还是我错了?代码如何读取
name
strncpy(client.str,name,20)存在问题;
因为两者都不能保证结果有
'\0'
终止。使用
scanf(“%19s”,name);