C++ 输出缓冲区和Cntrl+;退出程序
如果我有一个简单的程序像C++ 输出缓冲区和Cntrl+;退出程序,c++,output,buffer,C++,Output,Buffer,如果我有一个简单的程序像 #include <iostream> #include <fstream> using namespace std; int main(){ ofstream output("huh.txt"); int a; while(true){ cin >> a; output << a << endl; } } 然后按Cntrl+C退
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream output("huh.txt");
int a;
while(true){
cin >> a;
output << a << endl;
}
}
然后按Cntrl+C退出程序,将保存在huh.txt中的内容是:
2
3
4
5
6
7
7
7
7
7
我的主程序与此类似。它需要用户的连续输入,以放入输出文件中。唯一的问题是当使用Cntrl+C退出时,输出常常重复,如上图所示。Cntrl+C和“output”的缓冲区是如何处理的,使得7的输出比平常多4倍?通过Cntrl+C退出程序通常是一个坏主意吗?我可以用MSVC 2013在windows上重现这种情况,但不能在linux上重现 Ctrl+C导致
cin>>a
失败并设置文件结束标志。因此,a
不会被覆盖。当您不查看cin
的状态而一直循环时,您将继续输出最后一个(未更改的)有效值
Ctrl+C同时导致程序中断。这几乎是立即的,但只是几乎。例如,在windows中,Ctrl+C的处理完成了,留下主线程继续他正在做的事情,但一切都结束了。因此,无休止的循环将被终止信号打断,但它仍然可以执行一些迭代
避免此问题的最简单方法是正确处理输入错误:
while (true){
if (cin >> a)
output << a << endl; // output only if input was successful
}
while(true){
如果(cin>>a)
输出Ctrl+C当然不是用于正常终止。我认为您可以捕获并处理信号。我推测Ctrl+C会设置故障位或eofbit,以及异步终止。另外,while(cin>>a)
@MooingDuck是的,你是对的:我编辑了我的第一个答案,然后又做了一个额外的测试,测试表明Ctrl+C并没有添加新的输入,但确实设置了失败位。
while (true){
if (cin >> a)
output << a << endl; // output only if input was successful
}