C语言二进制文件读写异常,请求排查代码错误
问题分析与修复方案
嘿,作为C语言新手踩这个坑太正常啦!你的代码核心问题出在运算符优先级上,这直接导致文件指针没有正确初始化,所以读写操作全失败了。
核心错误:赋值与比较的优先级搞反了
C语言里,==(相等比较)的优先级比=(赋值)高。你写的:
if(f=fopen("dat", "wb") == NULL)
实际执行顺序是先判断fopen("dat", "wb") == NULL,得到一个布尔值(0或1),然后把这个值赋值给f。也就是说,f根本不是fopen返回的有效文件指针,而是一个0或1的整数,这时候调用fwrite肯定会失败,返回0也就不奇怪了。
第二个打开文件的语句if(f=fopen("dat", "rb+")==NULL)也犯了一模一样的错误。
修正后的代码
只需要给赋值操作加上括号,确保先完成文件指针的赋值,再判断是否为NULL:
#include <stdio.h> // 别忘了包含标准输入输出头文件,你的代码里没写哦 int main() { FILE *f; // 修正第一个fopen的优先级问题 if( (f = fopen("dat", "wb")) == NULL ){ perror("Failed to open file for writing"); // 加上错误提示,方便调试 return 1; } int c; for(int i = 0; i < 9; i++){ c = fwrite(&i, sizeof(int), 1, f); printf("Written %d items\n", c); // 现在应该会打印9次"Written 1 items" } fclose(f); // 修正第二个fopen的优先级问题 if( (f = fopen("dat", "rb+")) == NULL ){ perror("Failed to open file for reading"); return 1; } int a; while(fread(&a, sizeof(int), 1, f)){ printf("%d\n", a); // 现在应该会打印0到8这9个数字 } fclose(f); return 0; // main函数最好显式返回0表示正常结束 }
额外小提示
- 记得包含必要的头文件,比如
#include <stdio.h>,否则编译器可能会报错或者行为异常。 - 加上
perror函数可以在文件打开失败时输出具体的错误原因,比如权限问题、路径不存在等,比单纯返回1更利于调试。 main函数在正常结束时最好显式返回0,这是C语言的规范做法。
内容的提问来源于stack exchange,提问作者sale
相关产品推荐
相关产品推荐

