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

Win32下写模式打开现有二进制文件时fseek/fsetpos失效问题求解

解决方案

你需要使用rb+(也可以写作r+b,二者语义完全一致)作为文件打开模式。

模式特性说明

  • 所有带a标识的打开模式(包括ab/a+b等),C语言标准明确规定写入操作会强制将文件指针移动到末尾追加内容,和fseek设置的偏移无关,完全符合你测试到的现象。
  • 所有带w标识的打开模式(包括wb/w+b等),打开时会直接截断清空原有文件的全部内容,无法满足保留原有数据的需求。
  • rb+模式的行为完全匹配你的需求:
    • 以二进制模式打开已存在的文件,不会清空原有内容
    • 支持读写双向操作
    • 写入位置完全由当前文件指针决定,_fseeki64/fsetpos等设置偏移的接口可以正常生效,不会强制追加内容

修改后的示例代码

FILE *file = fopen(filename, "rb+");
// 可选逻辑:如果文件不存在,先创建空文件再重新打开
if (!file) {
    file = fopen(filename, "wb");
    fclose(file);
    file = fopen(filename, "rb+");
}
long long offset = 10;
_fseeki64(file, offset, SEEK_SET);
long value = 3452;
fwrite((char*)&value, 1, sizeof(long), file);
fclose(file);

注意事项

如果你写入的偏移位置超过了当前文件的总大小,文件中间会自动填充空字节,偏移位置之后的原有数据会正常保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:24:03