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

