You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于fread后二进制文件指针及空文件/单结构体文件的疑问

文件指针与fread/feof相关问题解答

示例代码

void main()
{ 
   FILE *cfPtr; /* credit.dat file pointer */
   /* create clientData with default information */
   struct clientData client = { 0, "", "", 0.0 };
   if ( ( cfPtr = fopen( "credit.dat", "rb" ) ) == NULL ) 
      printf( "File could not be opened.\n" );
   else { 
      printf( "%-6s%-16s%-11s%10s\n", "Acct", "Last Name",
         "First Name", "Balance" );
/* read all records from file (until eof) */
      fread( &client, sizeof( struct clientData ), 1, cfPtr );
      while ( !feof( cfPtr ) ) { 
         /* display record */
         if ( client.acctNum != 0 ) 
            printf( "%-6d%-16s%-11s%10.2f\n", 
               client.acctNum, client.lastName, 
               client.firstName, client.balance );
         fread( &client, sizeof( struct clientData ), 1, cfPtr );
      } /* end while */
      fclose( cfPtr ); /* fclose closes the file */
   } /* end else */
} /* end main */

问题解答

  • 问题1:若文件为空,struct client的内容是什么?
    当文件为空时,第一次调用fread会读取失败(返回0),此时client的内容会保持初始化时的默认值:acctNum为0,lastName和firstName是空字符串,balance为0.0。因为fread读取失败时不会修改目标内存的原有内容。

  • 问题2:若文件仅包含一个结构体,调用fread后文件指针会移动到结构体之后(即EOF位置),此时feof判断是否会为假导致该结构体无法被打印?
    不会,结构体可以正常打印,流程如下:

    1. 第一次fread成功读取到结构体,文件指针移动到EOF位置,但此时feof(cfPtr)不会返回真——feof的标志位只有在尝试读取越过EOF边界时才会被设置。
    2. 进入while (!feof(cfPtr))循环,此时feof标志未触发,条件为真,执行循环体打印该结构体(因为acctNum不为0)。
    3. 循环内再次调用fread,这次尝试读取越过EOF,fread返回0,同时设置feof标志位。
    4. 下一次循环判断!feof(cfPtr)时条件为假,退出循环。

内容的提问来源于stack exchange,提问作者omri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:27:25