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

