C语言 二进制文件读写失败

如果你在 C 语言中使用读写模式打开文件,却发现无法写入,这篇文章或许可以帮到你。

一、问题

问题具体表现为: r+ 模式打开文件,能正常使用 fread 读取文件并识别内容,使用 fwrite 能够正常编译并运行, fwrite 函数返回值也正确地显示为 count ,但检查文件内容却发现成功读入。

查阅《C 程序设计》和《C Primer Plus》都只有简单的 “ r+ 能够实现文件读写” ,无法解决我的困惑。更换编译环境问题依旧。

二、笨办法

可以尝试将所有文件内容读入内存,使用 fclose 关闭文件。进行修改操作后再重新打开文件写入。这样的方式在运行上是缓慢的,但能够解决上述的问题。

三、解决方法

When the “r+”, “w+”, or “a+” access type is specified, both reading and writing are allowed (the file is said to be open for “update”). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.

如果指定了 “r+”、“w+” 或 “a+” 访问类型,则允许读取和写入。但是,在读写之间切换时,必须有一个中间的 fflush、fsetpos、fseek 或 rewind 操作。

原代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FILE *fp;
if ((fp = fopen("文件名称", "rb+")) == NULL){ //打开对应文件
printf("文件出错。\n");
exit(0);
}

while (!feof(fp)){ //若没有到文件末尾,就循环读入并判断
fread(&tempstu, sizeof(struct Student), 1, fp); //读入内容
if (判断条件){
···修改内容···
fwrite(&tempstu, sizeof(struct Student), 1, fp); //将修改后内容写入
fclose(fp);
return;
}
}
fclose(fp);
printf("查找失败!");
system("pause");

修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FILE *fp;
if ((fp = fopen("文件名称", "rb+")) == NULL){ //打开对应文件
printf("文件出错。\n");
exit(0);
}

while (!feof(fp)){ //若没有到文件末尾,就循环读入并判断
fread(&tempstu, sizeof(struct Student), 1, fp); //读入内容
if (判断条件){
···修改内容···
fseek(fp, -sizeof(struct Student), 1);
fwrite(&tempstu, sizeof(struct Student), 1, fp); //将修改后内容写入
fclose(fp);
return;
}
}
fclose(fp);
printf("查找失败!");
system("pause");

参考