c++ - 为什么 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 });
}
解决方案
来自:https ://en.cppreference.com/w/cpp/io/manip/endl
在许多实现中,标准输出是行缓冲的,并且写入
'\n'
无论如何都会导致刷新,除非std::ios::sync_with_stdio(false)
被执行。
尝试从输出中删除std::endl
和'\n'
,您将获得所需的行为。正如马雷克所说,std::nounitbuf
是std::cout
.
推荐阅读
- sql-server - Spring boot:数据库连接未正确关闭
- three.js - Three.js:确定鼠标位置的世界坐标
- opencl - 隔离 CPU 内核上的 OpenCL
- angular - Angular 4更改路线
- c# - 带有 .NET Core 的 Material Design Lite 中的 Asp-for 标签助手
- ionic-framework - 相机的 FILE_URI 路径不适用于 IONIC 4
- ios - 实时事件数超过实时事件计数每日限制。事件不再是实时的
- rust - 编译器可以对 trait 的方法进行默认实现的内联吗?
- java - 如何在 Java 中为对象的重复实例定义标准?
- python - Python:在多个 Excel 工作表上打印输出