关于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
相关产品推荐
相关产品推荐

