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

C语言常见问题:如何正确递增存储在文件开头的int类型数值

问题原因

  • 核心问题是文件打开模式错误:你使用ab+模式打开文件,所有以a(追加)开头的文件打开模式,都会强制所有写操作自动定位到文件末尾,你调用fseek(file, 0, SEEK_SET)仅对读操作生效,写入递增后的val时还是会写到文件尾部,并没有覆盖开头的4字节内容,所以再次读取开头值还是原来的3。
  • 补充C标准规范:同一个FILE指针对应的读写操作切换时,必须中间调用fflush()、fseek()、fsetpos()或rewind()做同步,你的代码在写后读前加了fseek已经满足该要求,不属于本次问题的诱因。

修复方案

将increment_val函数的文件打开模式从ab+修改为rb+即可,rb+是以读写模式打开二进制文件,不会强制写操作追加到末尾,支持随机读写覆盖任意位置的内容。

如果你后续还要追加元素到文件尾部,在rb+模式下只需要在写元素前调用fseek(file, 0, SEEK_END)手动定位到末尾即可,完全可以满足你“开头存储总数量、后续存储元素”的需求。

修复后完整代码

#include <stdio.h>

void increment_val() {
    int val;
    // 打开模式替换为 rb+
    FILE *file = fopen("hey", "rb+");
    if (file == NULL) {
        perror("文件打开失败");
        return;
    }
    fread(&val, sizeof(int), 1, file);

    val++;

    fseek(file, 0, SEEK_SET);
    fwrite(&val, sizeof(int), 1, file);

    fseek(file, 0, SEEK_SET);
    fread(&val, sizeof(int), 1, file);

    printf("%d", val);

    fclose(file);
}

int main() {
    int val = 3;
    FILE *file = fopen("hey", "wb");
    if (file == NULL) {
        perror("文件打开失败");
        return 1;
    }
    fwrite(&val, sizeof(int), 1, file);
    fclose(file);

    increment_val();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:04