首页 > 解决方案 > 为什么 std::nounitbuf 在 MSVC 上没有做任何事情?

问题描述

我正在写一门关于现代 C++ 的课程并想解释刷新操作是如何工作的,所以我决定禁用自动刷新,以便仅在std::cout被销毁时才写入缓冲区。

为此,只有一个标准函数存在,它是 manipulator std::nounitbuf

但是,这不适用于MSVC

最让我吃惊的是,C 中的替代方法,setvbuf函数,实际上允许您禁用自动刷新。
这让我有点困扰,因为我想教 C++ 而不是 C。

谁能帮我?谢谢你!

#include <iostream>
#include <thread>

int main()
{
    std::cout << std::nounitbuf; // doesn't work (output is two Hello World before the 5 seconds delay)
    //setvbuf(stdout, nullptr, _IOFBF, BUFSIZ); // work (output is one Hello World, then another one after the 5 seconds)

    std::cout << "Hello World" << std::endl;
    std::cout << "Hello World";

    std::this_thread::sleep_for(std::chrono::seconds{ 5 });
}

标签: c++c++11visual-c++coutflush

解决方案


来自:https ://en.cppreference.com/w/cpp/io/manip/endl

在许多实现中,标准输出是行缓冲的,并且写入 '\n'无论如何都会导致刷新,除非std::ios::sync_with_stdio(false) 被执行。

尝试从输出中删除std::endl'\n',您将获得所需的行为。正如马雷克所说,std::nounitbufstd::cout.


推荐阅读