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

C语言中使用fseek实现文件随机写入的问题求助

问题分析与解决

你遇到的问题根源在于追加模式("a")的特性:根据C标准,当以"a"或"a+"模式打开文件时,所有写操作都会自动定位到文件末尾,不管你之前用fseek移动到了哪个位置。这就是为什么你明明fseek返回0(说明定位成功),但写入的内容还是跑到文件结尾的原因。

要实现在文件中间写入(覆盖原有内容),你需要使用读写模式"r+",这个模式不会截断文件,同时允许你定位到任意位置进行读写操作。

修改后的代码如下:

#include <stdio.h>

int main() {
    FILE* t = fopen("ttt", "w");
    fprintf(t, "1234567890");
    fclose(t);

    // 使用r+模式打开,支持读写且不截断文件
    t = fopen("ttt", "r+");
    if (t == NULL) {
        perror("fopen failed");
        return 1;
    }
    int result = fseek(t, 2, SEEK_SET);
    fprintf(stderr, "fseek result: %d\n", result);
    fprintf(t, "xxx");
    fclose(t);
    return 0;
}

运行这段代码后,文件ttt的内容会变成预期的12xxx67890。

额外注意事项

  • "r+"模式要求文件必须预先存在,如果文件不存在,fopen会返回NULL,所以需要添加错误检查。
  • 如果操作的是二进制文件,建议使用"rb+"和"wb+"模式,避免系统自动转换换行符导致的定位偏差。
  • 如果你需要的是插入内容(而不是覆盖),这种方法不适用,你需要先把插入点之后的内容读取到内存,写入新内容后再把原有内容追加回去。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:18:10