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

