输出缓冲区和 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
}
如果我有一个像这样的简单程序;
#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
}