如何制作一个简单的C++程序,其中没有刷新std :: cout

Cha*_*had 13 c++ buffer cout stdout stream

为了更好地理解C++中的缓冲流,我想编写一个简单的程序,std::cout在终止之前不刷新缓冲区.由于我已经读取了std::cout在正常终止时刷新,我尝试抛出运行时错误.我也避免使用std::endl,据我所知,强制冲洗.第一次尝试:

//file noflush.cpp
#include <iostream>

int main() {
    std::cout << "Don't write me to the console!";
    throw 0;
}
Run Code Online (Sandbox Code Playgroud)

用g ++编译,从终端调用:

$ ./noflush
libc++abi.dylib: terminating with uncaught exception of type int
Don't write me to the console!Abort trap: 6
Run Code Online (Sandbox Code Playgroud)

即使我强制运行时出错,看起来缓冲区在终止时仍然会被刷新.是否有可能在缓冲区中"绑定"某些数据,使其不被写入设备?

eer*_*ika 10

这不是标准的c ++,但在POSIX中,你可以发送一个"kill"信号来杀死正在运行的进程.这将停止执行而不进行清理,例如刷新缓冲区.

编辑:我意识到信号不仅是POSIX,而且实际上是C标准库的一部分(并包含在C++标准库中).

#include <csignal>
// ...
std::cout << "Don't write me to the console!";
std::raise(SIGKILL);
Run Code Online (Sandbox Code Playgroud)


Wal*_*ter 9

据我所知,没有符合标准的清洁方法,以避免std::coutflush()之前的程序终止(但是,当然,你可以使用不洁的方法,例如,无论是发出信号,直接间接地).根据cppreference,控制的实际缓冲区类型std::cout是实现定义但是派生自std::streambuf,它似乎不允许以模拟缓冲区静默吞咽的方式进行公共访问.

此外,正如我在评论中所指出的,甚至异常的程序终止(通过std::terminate()std::abort()可能或可能不会关闭开放资源,因此这又是实现定义的.