如果我有一个像<; p>这样的简单程序
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream output("huh.txt");
int a;
while(true){
cin >> a;
output << a << endl;
}
}
如果我输入
2
3
4
5
6
7
然后按Cntrl + C退出程序,将保存在huh.txt中的内容为:
2
3
4
5
6
7
7
7
7
7
我的主程序与此类似。它希望用户连续输入以放入输出文件。唯一的问题是当使用Cntrl + C进行退出时,输出通常会重复,如上所示。 Cntrl + C和“输出”的缓冲区到底是如何处理的,使7输出比平时多4倍?通过Cntrl + C退出程序通常是一个坏主意吗?
答案 0 :(得分:1)
我可以在Windows上使用MSVC 2013重现案例,但不能在Linux上重现。
Ctrl + C导致cin>>a
失败,并设置文件结束标志。因此a
不会被覆盖。当您在不查看cin
状态的情况下永远循环时,您将继续输出最后一个(未更改的)有效值。
Ctrl + C会导致程序在同一时间被中断。它几乎是即时的,但只是差不多。例如,在Windows中,Ctrl + C的处理完成by launching a separate thread,让主线程继续他正在做的事情。因此无限循环将被终止信号中断,但它仍然可以执行一些迭代。
避免此问题的最简单方法是正确处理输入错误:
while (true){
if (cin >> a)
output << a << endl; // output only if input was successful
}