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

C语言读写整数文件异常问题求助

C语言文件读写问题分析与修复

核心错误点

  • 文件打开模式错误:openfile函数用"wb"(二进制写模式)打开文件,该模式仅支持写入操作,无法读取数据,调用fread必然失败。读取文件需使用"rb"(二进制读模式)。
  • fread参数错误:flistsize本身已是int*类型指针,fread需要的是存储数据的内存地址,直接传flistsize即可。传&flistsize会把数据写入指针变量自身的内存,而非目标int变量,既导致读取失败还可能引发内存错误。
  • 文件打开检查顺序错误:openfile先执行fread再判断Movienames是否为NULL,若文件打开失败,Movienames为NULL,此时调用fread会触发未定义行为,必须先检查文件是否打开成功,再执行读写操作。
  • savenamefile逻辑错误:
    • 未打开文件就直接调用fwrite,Movienames初始为NULL,写入操作必然失败;
    • 判断Movienames == EOF完全错误,FILE*是指针类型,EOF是int常量,两者无比较意义,应检查fwrite和fclose的返回值;
    • 保存文件需先以"wb"模式打开,完成写入后再关闭。

修正后的代码示例

#include <stdio.h>
#include <stdlib.h>

FILE *Movienames = NULL;

// 读取文件,获取链表大小
int openfile(int *flistsize) {
    int reject = 0;
    // 以二进制读模式打开文件
    Movienames = fopen("movienames.txt", "rb");
    if (Movienames == NULL) {
        fputs("Error opening the name file\n", stderr);
        return -1;
    }
    // 直接传入flistsize,指向存储数据的int变量
    if (fread(flistsize, sizeof(int), 1, Movienames) != 1) {
        reject = -690;
        fputs("Error reading list size from file\n", stderr);
    }
    // 读取完成后关闭文件
    fclose(Movienames);
    Movienames = NULL;

    return reject == 0 ? 1 : -690;
}

// 保存文件,写入链表大小
int savenamefile(int flistsize) {
    int reject = 0;
    // 以二进制写模式打开文件
    Movienames = fopen("movienames.txt", "wb");
    if (Movienames == NULL) {
        fputs("Error opening file for writing\n", stderr);
        return -1;
    }
    // 写入链表大小
    if (fwrite(&flistsize, sizeof(int), 1, Movienames) != 1) {
        reject = -690;
        fputs("Error writing list size to file\n", stderr);
    }
    // 关闭文件并检查操作是否成功
    if (fclose(Movienames) == EOF) {
        fputs("Error closing file\n", stderr);
        return -69;
    }
    Movienames = NULL;

    if (reject == -690) {
        return -690;
    }
    puts("successfully closed/saved file");
    return 1;
}

额外建议

  • 避免用宏定义处理文件打开/关闭操作,宏展开易隐藏错误,直接调用fopen、fclose可读性更强;
  • 结构体链表读写需注意:节点内的指针不能直接写入文件(内存地址重启后无效),需逐个写入节点的数据内容,读取时重新创建节点构建链表;
  • 所有文件操作后必须检查返回值,包括fopen、fread、fwrite、fclose,便于快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:44:55