文件写入与循环if语句应用问题:基础信息录入系统开发故障
修复你的简易信息录入系统问题
嘿,我看你这个信息录入系统卡在了文件写入和循环控制上,结合你描述的问题和代码片段,我整理了一套修复方案,咱们一步步来:
先梳理核心问题的常见诱因
从你说的症状来看,大概率是这几个点出了问题:
- 文件操作时没检查打开状态,或者写入方式不对
- 输入
edit时的循环跳转逻辑没处理好,比如没重置录入流程的状态,或者残留了缓冲区的换行符干扰判断 - 重复询问的循环条件写反了,或者字符串比较时没处理
fgets读入的换行符
修正后的完整代码
#include <stdio.h> #include <string.h> // 封装输入函数,自动去除换行符 int get_line(const char *prompt, char *dest, size_t size) { printf("%s", prompt); // 读取输入,失败直接返回错误 if (fgets(dest, size, stdin) == NULL) { return -1; } // 去掉fgets读入的换行符 dest[strcspn(dest, "\n")] = '\0'; return 0; } int main() { char name[50], id[20], confirm[10]; int should_restart; do { should_restart = 0; // 录入基础信息 printf("=== 开始录入信息 ===\n"); get_line("请输入姓名:", name, sizeof(name)); get_line("请输入ID:", id, sizeof(id)); // 展示信息 printf("\n=== 你录入的信息如下 ===\n"); printf("姓名:%s\n", name); printf("ID:%s\n", id); // 确认流程 while (1) { get_line("确认信息是否正确?(输入y确认写入,输入edit重新录入,其他内容重复询问):", confirm, sizeof(confirm)); // 处理edit回到录入起点 if (strcmp(confirm, "edit") == 0) { should_restart = 1; break; } // 确认写入文件 else if (strcmp(confirm, "y") == 0) { // 打开文件,用追加模式(如果要覆盖就用"w") FILE *fp = fopen("user_info.txt", "a"); if (fp == NULL) { printf("错误:无法打开文件!\n"); break; } // 写入信息 fprintf(fp, "姓名:%s,ID:%s\n", name, id); fclose(fp); printf("信息已成功写入文件!\n"); should_restart = 0; break; } // 其他输入重复询问 else { printf("输入无效,请重新输入!\n"); } } } while (should_restart); // 当需要重启时回到录入起点 printf("程序结束!\n"); return 0; }
关键改动说明
- 输入函数优化:在
get_line里用strcspn去掉了fgets读入的换行符,避免后续字符串比较时因为隐藏的换行符导致判断失败(比如用户输入edit后,原代码可能读成edit\n,和"edit"比较就不相等) - 文件写入修复:
- 打开文件时增加了空指针检查,避免文件打不开时直接写入导致崩溃
- 使用
"a"追加模式(如果需要每次覆盖文件就换成"w"),确保信息能正确写入 - 写完后及时关闭文件,避免资源泄漏
- 循环控制逻辑:
- 用
should_restart变量控制外层循环,输入edit时把它设为1,直接跳出内层确认循环,回到录入起点 - 内层确认循环用
while(1)做无限循环,只有触发edit、y或者文件错误时才跳出,确保其他输入会重复询问
- 用
- 用户体验优化:增加了清晰的分隔线和提示文本,让流程更直观
你可以把这段代码替换你的原有代码试试,应该能解决文件写入和循环控制的问题~
内容的提问来源于stack exchange,提问作者JC67123949
相关产品推荐
相关产品推荐

