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

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表示正常结束
}

额外小提示

  1. 记得包含必要的头文件,比如#include <stdio.h>,否则编译器可能会报错或者行为异常。
  2. 加上perror函数可以在文件打开失败时输出具体的错误原因,比如权限问题、路径不存在等,比单纯返回1更利于调试。
  3. main函数在正常结束时最好显式返回0,这是C语言的规范做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:25:37