为什么std::nounitbuf不';我在MSVC上什么都做不了? 我正在编写一个关于现代C++的教程,想解释一下刷新操作是如何工作的,所以我决定禁用自动刷新,以便在> STD::CUT被破坏时写入缓冲区。
因此,只有一个标准函数存在,它是操纵器为什么std::nounitbuf不';我在MSVC上什么都做不了? 我正在编写一个关于现代C++的教程,想解释一下刷新操作是如何工作的,所以我决定禁用自动刷新,以便在> STD::CUT被破坏时写入缓冲区。,c++,c++11,visual-c++,cout,flush,C++,C++11,Visual C++,Cout,Flush,因此,只有一个标准函数存在,它是操纵器std::nounitbuf 但是,这在MSVC上不起作用 最让我吃惊的是,C语言中的另一个选项,即setvbuf函数,实际上允许您停用自动刷新。 这让我有点烦,因为我想教C++而不是C.< 有人能帮我吗?谢谢大家! #include <iostream> #include <thread> int main() { std::cout << std::nounitbuf; // doesn't work (ou
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 });
}
#包括
#包括
int main()
{
标准::cout来自:
在许多实现中,标准输出是行缓冲的,并且可以写入
“\n”
无论如何都会导致刷新,除非std::ios::sync_with_stdio(false)
他被处决了
尝试从输出中删除std::endl
和'\n'
,您将获得所需的行为。正如Marek所说,std::nounitbuf
是std::cout
的默认设置
为什么std::nounitbuf什么都不做
很可能是因为标准cout
流默认情况下,unitbuf
标志是未设置的(要求仅为cerr
设置)
有人能帮我吗
C++已同步(未缓冲)使用stdio streams。您编写的std::cout您能解释它是如何工作的吗?在程序结束之前,您至少应该获得一行输出,作为std::endl
调用flush
以清除刚刚发送到流的行。既然您使用std::endl
显式地刷新缓冲区,那么std::nounitbuf
没有机会完成它的工作。另外,std::nounitbuf
是默认设置。你不明白,即使没有显式刷新,它也不起作用!这就是重点。如果你愿意,你可以试试:std::nounitbuf不起作用(顺便说一句,std::unitbuf似乎工作得很好)std::cout
不是单元缓冲的,因此设置nounitbuf
没有任何作用。请使用std::cerr
试试。请注意,单元缓冲意味着每次插入后都会刷新;禁用它不会影响刷新流的std::endl
,也不会影响插入时刷新的行缓冲你可以解释一下为什么StvvBuf正在处理Stdout吗?谢谢!不工作,你可以试试你的编译器并显示结果,你会看到C版本正在工作,C++版本不工作(在Cout上)我的编译器是gcc 9.3.0。如果我从你的代码中删除“\n”和std::endl,我会在5秒后得到输出。它在msvc上不起作用。一声巨响:/n你确定\n
会导致刷新吗?@MaxKozlov在msvc中没有行缓冲,所以\n
不会刷新流:仍然不起作用(参见其他答案)至少在msvc和clang上是这样的:/所以可能已经设置好了。试着取消设置。相信我,我已经尝试了我能做的一切x)(但是std::unitbuf正在工作,但这不是我需要的)从我在msvc上的测试来看,它只在使用setvbuf
和nounitbuf
应用于cout
(注意这是std::cout
的默认标志,因此必须应用unitbuf
来禁用它)。
#include <iostream>
#include <thread>
int main() {
std::ios::sync_with_stdio(false);
std::cout << "Hello World" << std::endl;
std::cout << "Hello World\n";
std::this_thread::sleep_for(std::chrono::seconds{ 5 });
}