遇到的问题:
之前写一个文件重定向沙盒时,文件的变动记录在一个 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);