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

标签 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;
    }


}

如果我输入

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/

相关文章:

c++ - 是否有 .at() 等效于 multimap ?

Java XML 解析和写入导致缺少行尾

将缓冲区转换为 8 位值数组并返回 C

c++ - 如何使这个 C++ 代码更 DRY?

c++ - 为什么删除两次相同的内存都没有报错?

c++ - std::bind 类内部,事件系统的一般概念

output - "usage"通知是否打印到 stderr?

java - 使用 PrintWriter 写入文件结果不正确

根据数据表在 C 中创建数组

javascript - 如何将二进制缓冲区解码为 node.js 中的图像?