Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 输出缓冲区和Cntrl+;退出程序_C++_Output_Buffer - Fatal编程技术网

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
}