C语言修改文本文件指定值时while循环内if语句后程序异常求助
问题原因分析
- 读写接口混用:你同时使用
fread(二进制结构体读取)和fscanf(文本格式化读取)操作同一个文件流,两种接口的文件指针偏移逻辑完全不同,会导致指针位置错乱,是程序卡住的核心原因。同时你用文本模式r/w打开文件,和二进制读写接口本身就不匹配。 - 重复读取数据:while循环的判断条件已经调用
fread读取了一次数据,循环内部又调用fscanf再次读取,相当于每次循环会跳过一条数据,最终会提前读到文件末尾,或者读到无效数据触发运行异常。 - 标记位逻辑错误:用来标记是否找到对应ID的变量
v全程没有被赋值为1,哪怕匹配到了目标ID,最终也会输出未找到的提示。 - 基础语法错误:打开文件失败的提示文本拼写错误,字符串中的换行没有使用转义符
\n而是直接输入回车,会导致编译异常或者输出格式错乱。
修复代码
如果你存储数据的donation.txt是普通文本格式,全程使用文本读写接口即可,修复后代码如下:
int Equant() { DisplayList(); FILE * fpr_r = fopen("donation.txt", "r"); FILE * fpr_w = fopen("Edonation.txt", "w"); if (fpr_r == NULL || fpr_w == NULL) { printf("Unable to open the file\n"); exit(1); } int Inumber, v=0; double NVQuant; struct Donate Esearch; printf("\nEnter the ID you want to change the quantity: "); scanf("%d", &Inumber); // 改用文本格式化读取作为循环条件,不要混用fread while (fscanf(fpr_r,"%d %s %s %s %d %lf", &Esearch.IDd, Esearch.supply, Esearch.Scode, Esearch.Cdonator, &Esearch.Nship, &Esearch.QuantityR) == 6) { if (Esearch.IDd == Inumber) { v = 1; // 找到匹配项,标记位设为1 printf("ID: %d Name of Supply: %s, Supply Code: %s, Donator: %s, No. of Shipment: %d, Quantity Received (Million): %lf\n", Esearch.IDd, Esearch.supply, Esearch.Scode, Esearch.Cdonator, Esearch.Nship, Esearch.QuantityR); printf("\nEnter the new Quantity value: "); scanf("%lf", &NVQuant); Esearch.QuantityR = NVQuant; } // 改用文本格式化写入,不要用fwrite fprintf(fpr_w, "%d %s %s %s %d %lf\n", Esearch.IDd, Esearch.supply, Esearch.Scode, Esearch.Cdonator, Esearch.Nship, Esearch.QuantityR); } fclose(fpr_r); fclose(fpr_w); if (!v) { printf("No line founded.\n"); } // 原函数有int返回值,记得补充return语句 return 0; }
额外注意事项
- 如果你的数据是用二进制方式写入
donation.txt的,就全程使用fread、fwrite接口,去掉循环内的fscanf语句即可。 - 操作完文件后可以把
Edonation.txt替换回原文件,完成修改逻辑。
内容的提问来源于stack exchange,提问作者user17401982
相关产品推荐
相关产品推荐

