如果我有一个像这样的简单程序;
#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 退出程序通常是个坏主意吗?
最佳答案
我可以在带有 MSVC 2013 的 Windows 上重现该案例,但不能在 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
}
关于c++ - 输出缓冲区和 Ctrl+C 退出程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29525453/