输出缓冲区和 Ctrl+C 退出程序

Output buffer and Cntrl+C to exit program

如果我有一个像这样的简单程序;

#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 和 "output" 的缓冲区究竟是如何处理的,使得 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
}