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

时间:2015-04-08 21:14:01

标签: c++ output buffer

如果我有一个像<; 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退出程序通常是一个坏主意吗?

1 个答案:

答案 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
}