C语言将用户输入写入txt文件遇无限循环问题求助
解决你的C语言项目输入循环与二进制写入问题
看起来你的代码卡在了输入循环里,一直输出提示却没法接收用户输入,大概率是输入缓冲区处理不当或者scanf的使用有问题。我帮你梳理了需求并给出修复后的代码,同时解释关键要点:
核心需求回顾
- 循环接收用户输入:零件号(整数)、数量(整数)、价格(浮点数)
- 输入零件号为
0时退出程序 - 必须用
fwrite以二进制模式写入文件
修复后的完整代码
#include <stdio.h> #include <stdlib.h> // 把三个数据打包成结构体,方便二进制写入 typedef struct { int part_number; int quantity; float price; } Item; int main() { FILE *file; Item item; int input_result; // 以二进制写入模式打开文件("wb"会覆盖原有内容,要追加就用"ab") file = fopen("items_data.txt", "wb"); if (file == NULL) { perror("Failed to open file"); exit(EXIT_FAILURE); } printf("=== Item Data Entry ===\n"); printf("Enter part number, quantity, price (enter 0 as part number to exit)\n"); while (1) { printf("\nPlease enter item data: "); // 读取三个值,同时检查输入是否成功 input_result = scanf("%d %d %f", &item.part_number, &item.quantity, &item.price); // 触发退出条件:零件号为0 if (item.part_number == 0) { break; } // 处理输入错误(比如用户输入了非数字) if (input_result != 3) { printf("❌ Invalid input! Please enter three valid numbers.\n"); // 清理输入缓冲区的垃圾数据,避免无限循环 while (getchar() != '\n'); continue; } // 用fwrite写入二进制数据 size_t written_count = fwrite(&item, sizeof(Item), 1, file); if (written_count != 1) { perror("Failed to write data to file"); fclose(file); exit(EXIT_FAILURE); } printf("✅ Item saved successfully!\n"); } // 一定要记得关闭文件 fclose(file); printf("\nProgram exited. All data saved to items_data.txt.\n"); return 0; }
关键修复点解释
结构体封装数据
把三个相关数据打包成结构体,fwrite可以一次性写入整个结构体的二进制数据,比单独写三个变量更高效、规整。二进制文件打开模式
用"wb"而不是普通的"w",二进制模式会避免系统自动转换换行符,保证写入的二进制数据准确(即使文件后缀是.txt也没问题)。如果需要追加数据而不是覆盖原有内容,改成"ab"即可。处理
scanf的返回值scanf会返回成功读取的变量个数,如果不是3,说明用户输入不符合要求(比如输了字母)。这时候必须清理输入缓冲区,否则残留的错误数据会导致下一次scanf直接失败,陷入无限循环输出提示的死胡同。输入缓冲区清理
当输入错误时,用while (getchar() != '\n')把缓冲区里的所有字符读到换行符为止,确保下一次scanf能接收新的输入。退出条件的正确判断
当用户输入的零件号为0时,直接break退出循环,符合需求。
原问题的根本原因
你原来的代码应该是没有检查scanf的返回值,也没有处理输入错误后的缓冲区清理。当输入出错时,scanf读取失败,错误数据留在缓冲区里,下一次循环又执行printf,然后scanf再次读取到错误数据,再次失败,导致无限循环输出提示。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

