C++程序写入txt条目时无限循环及char变量作用域报错问题咨询
你之前把command放在do循环内部报未定义的原因是:do-while结构的while(判断条件)部分不属于do块的作用域,内部声明的变量在while判断时无法访问,因此你当前将command声明在main函数开头、do循环外部的写法是完全正确的,不需要调整,也不需要用传值/传引用处理这个变量,你遇到的问题是其他逻辑错误导致的:
问题1:do-while循环条件逻辑错误
你当前的循环判断条件:
while(command != 'D' || command != 'd');
逻辑永远为真:无论输入的是大写D还是小写d,两个判断条件总有一个成立,或运算结果永远为true,程序永远无法退出循环。
修复方案:
将逻辑或||改为逻辑与&&:
while(command != 'D' && command != 'd');
问题2:输入缓冲区残留换行符导致cin.get不等待输入
你用cin >> command读取命令字符时,输入结束按下的回车键会作为换行符\n残留在输入缓冲区中。后续add_entry中调用的cin.get()会优先读取这个残留的换行符,相当于直接读到了空输入,不会等待用户手动输入,看起来就像进入了无限循环。
修复方案:
在cin >> command后添加代码清空输入缓冲区:
cin >> command; // 新增以下代码,清空缓冲区直到遇到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n');
注意需要在头文件中引入<limits>头文件才能使用numeric_limits
问题3:add_entry中cin.get未处理每行结尾的换行符
cin.get()默认只会读取到换行符前的内容,不会吃掉换行符,如果你读完一行后不清空换行,下一次调用cin.get()又会直接读到空输入。
修复方案:
在add_entry的每一次cin.get()调用后都添加一次cin.ignore()清空换行:
cout << "Enter a concept name: "; cin.get(name, SIZE); cin.ignore(); // 清空当前行末尾的换行符 cout << endl << "Enter an example of the syntax: "; cin.get(example,SIZE); cin.ignore(); // 后续每个cin.get后都加这行即可
额外问题说明:display_entry读取文件逻辑不匹配
你写入文件时的格式是Name: xxx这种带前缀的行,但读取时用myfile >> name >> example是按空格分割读取,完全匹配不上写入的格式,会导致读取结果异常。如果要正常读取,要么写入时不要加前缀直接存字段值,要么读取时按行读取后解析内容。
内容的提问来源于stack exchange,提问作者newtDOTexe

