Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么std::nounitbuf不';我在MSVC上什么都做不了? 我正在编写一个关于现代C++的教程,想解释一下刷新操作是如何工作的,所以我决定禁用自动刷新,以便在> STD::CUT被破坏时写入缓冲区。_C++_C++11_Visual C++_Cout_Flush - Fatal编程技术网

为什么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 });
}