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

关于C语言代码中fseek函数两次调用原因的技术问询

为什么在fwrite前需要再次调用fseek?

这段代码里第二次fseek的核心作用是把文件指针移回目标记录的起始位置,原因很直接:

当你第一次用fseek定位到目标账户对应的结构体位置后,调用fread读取这个结构体时,文件指针会自动向后移动sizeof(struct clientData)字节——也就是直接跳到了当前记录的下一个位置。如果这时候直接调用fwrite,数据会被写到下一个账户的位置,而不是你原本要修改的目标账户位置,自然会导致程序逻辑混乱、数据错位。

举个具体例子:假设你要操作账户1,第一次fseek把指针移到文件开头((1-1)*sizeof(...) = 0),fread读完账户1的结构体后,指针会移动到sizeof(struct clientData)的位置,也就是账户2的起始处。如果不再次fseek,直接fwrite就会把新数据写到账户2的位置,而账户1还是原来的空值,完全不符合你的需求。

所以第二次fseek必须把指针重新移回目标账户的起始位置,才能让fwrite把新数据正确覆盖到对应的记录上。

附相关代码

// newRecord函数
void newRecord( FILE *fptr ) {
     unsigned int account;
     printf("%s", "Enter new account number (1 - 100): ");
     scanf("%d", &account );
     fseek( fptr, ( account - 1 ) * sizeof( struct clientData ), SEEK_SET );
     struct clientData client;
     fread( &client, sizeof( struct clientData ), 1, fptr );
     if ( client.accNum == 0 ) {
          printf("%s", "Enter lastname, firstname, balance\n? ");
          scanf("%14s%9s%lf", client.lastName, client.firstName, &client.balance);
          client.accNum = account;
          fseek( fptr, ( account - 1 ) * sizeof( struct clientData ), SEEK_SET );
          fwrite( &client, sizeof( struct clientData ), 1, fptr );
     }
     else {
          printf( "Account #%d already contains informations.\n", client.accNum );
     }
}

// clientData结构体定义
struct clientData {
     unsigned int accNum;  //account number
     char lastName[15];
     char firstName[10];
     double balance;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:50:37