【发布时间】:2013-07-31 18:03:55
【问题描述】:
为什么下面的代码没有阻止编译器自动刷新缓冲区?
cout.sync_with_stdio(false);
cin.tie(nullptr);
cout << "hello";
cout << "world";
int a;
cin >> a;
输出:
helloworld
我正在使用 Visual Studio 2012 Ultimate
【问题讨论】:
-
流可以随时清除角色。
-
@DanielKO 但在任何合理的实现中,它都不会。它只会在请求时或缓冲区已满时刷新。我无法想象他的文字会填满缓冲区。 (另一方面,默认情况下,当您从
std::cin输入时,它将刷新std::cout。) -
@James Kanze cout 可以是任何具体类型,只要它继承自 std::ostream。它可以为所欲为,甚至可以通过 fprintf() 进行打印,这是一个很好的工具。例如,libstdc++ 使用 __gnu_cxx::stdio_filebuf 实现 cout。不使用 fprintf,而是使用 fwrite。同样的事情。
-
@DanielKO 当然。一个实现也可以为每个字符输出休眠 5 秒,并且仍然保持一致。还有 QoI 考虑因素。一个人有一定的期望,至少在某些系统上是这样;从质量的角度来看,系统应该满足这些要求。而且大多数系统确实在特定点上以某种方式失败。
标签: c++ visual-studio visual-c++ visual-studio-2012