C++程序线程休眠前字符串无法输出问题咨询
问题:输出"Grading..."后程序直接休眠,字符串无法立即显示
我正在开发一款文本游戏,初始阶段用户需要完成测试,测试结束后程序会评分并展示成绩。为了营造评分需要时间的效果,我想让程序暂停一会儿,但现在的问题是,程序会直接进入休眠状态,"Grading..."字符串根本没机会显示;可一旦注释掉线程休眠的代码,这个字符串就能正常显示了。
我的代码如下:
#include <iostream> using namespace std; int main(){ char questionAnswer; int randomAnswer; string testAnswers, testKey; //create test answers for(int answer = 0; answer < 5; answer++){ randomAnswer = rand()%4+1; switch(randomAnswer){ case 1: testKey += 'A'; break; case 2: testKey += 'B'; break; case 3: testKey += 'C'; break; case 4: testKey += 'D'; break; } } //start test for(int question = 0; question < 5; question++){ cout << "Question " << question+1 << ":\t"; cin >> questionAnswer; while(toupper(questionAnswer) != 'A' && toupper(questionAnswer) != 'B' && toupper(questionAnswer) != 'C' && toupper(questionAnswer) != 'D'){ cout << "\nInput Valid Answer:\t"; cin >> questionAnswer; } testAnswers += toupper(questionAnswer); cout << endl; } cout << "\nGrading..."; //pause fo dramatic effect this_thread::sleep_for(5s); cout << "Student Answers:\t" << testAnswers << endl; cout << "Test Answers:\t" << testKey << endl; }
解决方案
问题根源是标准输出的缓冲区机制:cout默认采用行缓冲,只有遇到换行符\n、缓冲区填满,或者主动调用刷新操作时,才会把缓冲区里的内容输出到控制台。你的cout << "\nGrading...";没有触发缓冲刷新,内容还留在内存里,程序就直接进入休眠了。
三种解决办法:
- 用
endl代替普通输出:endl会自动输出换行符并刷新缓冲区cout << "\nGrading..." << endl; - 手动调用刷新函数:在输出后直接调用
flush()强制刷新cout << "\nGrading..."; cout.flush(); - 设置无缓冲模式:在程序开头添加一行代码,让
cout实时输出内容cout.setf(ios::unitbuf);
额外的代码修复建议:
- 使用
this_thread::sleep_for需要包含头文件<thread>,否则编译会报错 rand()生成的随机数默认是固定序列,需要用srand(time(nullptr))初始化随机种子,确保每次运行生成的测试答案不同
修改后的完整代码:
#include <iostream> #include <thread> #include <ctime> using namespace std; int main(){ char questionAnswer; int randomAnswer; string testAnswers, testKey; // 初始化随机种子,确保每次生成不同答案 srand(time(nullptr)); // 生成测试答案 for(int answer = 0; answer < 5; answer++){ randomAnswer = rand()%4+1; switch(randomAnswer){ case 1: testKey += 'A'; break; case 2: testKey += 'B'; break; case 3: testKey += 'C'; break; case 4: testKey += 'D'; break; } } // 开始测试 for(int question = 0; question < 5; question++){ cout << "Question " << question+1 << ":\t"; cin >> questionAnswer; while(toupper(questionAnswer) != 'A' && toupper(questionAnswer) != 'B' && toupper(questionAnswer) != 'C' && toupper(questionAnswer) != 'D'){ cout << "\nInput Valid Answer:\t"; cin >> questionAnswer; } testAnswers += toupper(questionAnswer); cout << endl; } cout << "\nGrading..." << endl; // 用endl自动刷新缓冲区 // 暂停营造评分耗时效果 this_thread::sleep_for(5s); cout << "Student Answers:\t" << testAnswers << endl; cout << "Test Answers:\t" << testKey << endl; return 0; }
内容的提问来源于stack exchange,提问作者Lucas Sintim
相关产品推荐
相关产品推荐

