【问题标题】:Disable printf using freopen stdout while keeping std::cout functioning使用 freopen stdout 禁用 printf,同时保持 std::cout 正常运行
【发布时间】:2020-12-18 10:01:26
【问题描述】:

我有一段代码以ostream 作为输入,可以是std::coutstd::sstream 并输出到它。

void myFunction(std::ostream out)
{
    out << "output";
}

同时我想禁止任何第三方库使用printf,这样他们就不会干扰我的输出,以防out == std::cout。我可以通过使用freopenstdout 重定向到NUL 来实现这一点,但这会阻止我的代码正确打印到std::out

有没有办法只重定向printf,同时保持std::cout 正常工作?

我目前的解决方案如下,但函数不再与 out 的类型无关。

void myFunction(std::ostream out)
{
    unlockStdout();  // redirect stdout to the original stdout
    out << "output";
    lockStdout(); // redirect stdout to NUL
}

【问题讨论】:

  • 你为什么不把dup2() STDOUT_FILENO 放到你用来做你的东西的iostream,然后重新打开stdout/dev/null
  • 恐怕没有仅使用标准 C++ 库的可移植方式。所以最好的确实是 EOF 建议。
  • @EOF 你能提供一个如何dup2 到iostream 的例子吗?

标签: c++


【解决方案1】:

我很确定这是不可能的(至少使用标准的 c/c++/posix)。这是因为 printf 直接使用 STDOUT - 较低级别。一旦您重定向 STDOUT,可以说“游戏结束”(再次重申:除非您超出标准)。

如果你愿意,你可以做相反的事情——即只重定向std::cout而不重定向printf

【讨论】:

  • 如果我将 stdout 重定向到 NUL,printf 将无法再打印。还行吧。在这一点上如何使 cout 打印是我所缺少的。
  • @SimoneGaiarin 这就是为什么我或多或少地写了它的游戏,除非你想去非标准(我不知道怎么做)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2016-12-29
  • 2015-08-16
  • 1970-01-01
  • 2015-07-22
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多