- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读 freopen()
并意识到如果我们为其指定 stdin/stdout,即使我们使用 cin/cout 进行编码,该函数也能正常工作。
稍微研究一下,我找到了这个链接 freopen() equivalent for c++ streams ,其中一位用户回答:
From C++ standard 27.3.1:
"The objectcin
controls input from a stream buffer associated with the objectstdin
, declared in<cstdio>
."
So according to the standard, if we redirectstdin
it will also redirectcin
. Vice versa forcout
.
在 CPPReference 上也看到了类似的东西:
http://en.cppreference.com/w/cpp/io/cin
http://en.cppreference.com/w/cpp/io/cout
The global objects std::cout and std::wcout control output to a stream buffer of implementation-defined type (derived from std::streambuf), associated with the standard C output stream stdout.
这就是它有点令人困惑的地方,因为我也在阅读有关刷新的内容并注意到 fflush(stdout) 根本无法与 cin/cout 一起工作。
例如,此示例代码不会打印任何内容:
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cout << "Please, enter a number: \n";
fflush(stdout);
cin >> n;
}
虽然下面的代码将打印到 output.txt:
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
freopen("output.txt", "w", stdout);
cout << "Some string";
while (true);
}
删除 ios::sync_with_stdio(false);
从第一个示例代码来看,它的行为符合预期。和 freopen()
无论如何都可以工作(有或没有它)。
所以问题是:为什么 fflush(stdout) 不适用于 iostream,而 freopen(..., stdout) 有效?也许,这个问题可以更深入:cin/cout 与 stdin/stdout 关联的扩展名是什么?
抱歉发了这么长的帖子。我尽量做到详细和简洁。
我希望这是可以理解的。
提前致谢。
附言:我输入了ios::sync_with_stdio(false);
和 cin.tie(0);
故意的。
最佳答案
我的第一个问题是“您为什么要这样做”?有一个std::ostream::flush()
为此目的的功能,所以使用它,例如cout.flush();
。
它“不起作用”的原因是用 fflush(FILE* f)
刷新的缓冲区与用于 std::ostream 的缓冲区不同
(或者至少不能保证它会是)。 std::ostream::flush()
很可能会在作为实现一部分的基础文件对象上调用 fflush(FILE*)
。
关于C++ - 为什么 fflush(stdout) 不适用于 iostream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41776514/
我是一名优秀的程序员,十分优秀!