C语言 fseek、_fseeki64返回成功,文件指针被指向错误位置 解决思路

遇到的问题:

之前写一个文件重定向沙盒时,文件的变动记录在一个 List 链表当中,
为了解决突发情况下(例如:物理机重启),沙盒被意外关闭可以还原

将链表记录在文件中

我们的沙盒产品目的是为了运行游戏,而游戏追求效率

优化代码时:

我将每次写入时,打开文件,写结束后,关闭文件
改为
沙盒启动时,打开文件,拿着句柄
每次检查句柄后,写入
沙盒退出时,关闭文件

调试 发现,沙盒不能正确恢复
检查 发现了一个新问题,调用fseek
无论 偏移为多少
无论 初始位置为SEEK_END | SEEK_SET | SEEK_CUR
文件指针在调用fseek后始终指向,文件开头

多方查找,没有解决方法后,我改为调用WindowsAPI先解决问题
事后请教大佬,整理了思路,供大家做个参考
希望可以帮到有需要的朋友

解决思路

普通的文件写入操作 fputc,fputs,fprintf,fwrite

int fputc(int char, FILE *stream);
int fputs(const char *str, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

调用写入操作后,数据并没有立即写入磁盘文件中

此时 SEEK_END | SEEK_SET | 文件大小, 还是 调用fopen拿到FILE * 时的值
调用fseek、_fseeki64移动文件指针,返回值为0,0为操作成功
但是文件指针未被指向预期的位置

int fseek(FILE *stream, long int offset, int whence);/* 如果成功 返回0 */
int _fseeki64(FILE *stream, __int64 offset, int origin);/* 如果成功 返回0 */

只有当 fflush 或 fclose 文件时,数据才真正写入文件

int fflush(FILE *stream);
int fclose(FILE *stream);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值