【发布时间】:2021-04-10 07:53:10
【问题描述】:
我正在编写关于现代 C++ 的课程并想解释刷新操作的工作原理,因此我决定禁用自动刷新,以便仅在 std::cout 被销毁时才写入缓冲区。
为此,只有一个标准函数存在,它是操纵器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 });
}
【问题讨论】:
-
你能解释一下它是怎么不工作的吗?在程序结束之前,您至少应该得到一行输出,因为
std::endl调用flush以清除刚刚发送到流的行。 -
因为您使用
std::endl显式刷新缓冲区,所以std::nounitbuf没有机会完成它的工作。std::nounitbuf也是默认设置。 -
你不明白,即使没有显式冲洗,它也不起作用!这才是重点。如果你愿意,你可以试试:std::nounitbuf 不工作(顺便说一句 std::unitbuf 似乎工作得很好)
-
std::cout不是单位缓冲的,因此设置nounitbuf不会做任何事情。试试std::cerr。请注意,单元缓冲意味着每次插入后刷新;禁用它不会影响std::endl,它会刷新流,也不会影响行缓冲,当您插入'\n'时会刷新。 -
那么你能解释一下为什么 setvbuf 在标准输出上工作吗?谢谢!
标签: c++ c++11 visual-c++ cout flush