以编程方式忽略printf

时间:2015-05-14 10:29:23

标签: c++ printf

我正在使用someones库,当与设备的连接失败时,printf会输出错误消息。 连接成功时,库代码不打印任何内容。

我定期检查(循环和睡眠)以查看设备是否已连接,但我只想在连接时打印出来。

目前,我得到了类似的内容:

Waiting for connection... (<-- My print)
Error
Error
Error
Error
Error
Connection successful (<-- My print)

我想要的是:

Waiting for connection... (<-- My print)
Connection successful (<-- My print)

我如何以编程方式忽略printf?

N.b。我发现了一个类似的问题Programmatically Ignore Cout,但该解决方案不适用于printf。

我正在使用Windows。

有人可以帮忙吗? (c / c ++新手)

4 个答案:

答案 0 :(得分:2)

您是否尝试过(在建立连接之前):

FILE * myout = stdout;
stdout = fopen ("standard-output-file", "w");

要输出要输出的内容,您可以使用:

fprintf(myout, "format", ...);

编辑:请记住以后关闭文件描述符:

fclose(myout);

答案 1 :(得分:0)

我能够通过以下方式在Linux下工作

#include <cstdio>

using namespace std;

int main() {
   printf("Start\n");
   freopen("/dev/null", "w", stdout);
   printf("middle\n");
   freopen("/dev/stdin", "w", stdout);  // really stdin here!
   printf("End\n");
   return 0;
}

在Windows下我认为文件还有其他名称(nulcon可能)。

然而,这似乎完全不可移植,更糟糕的是,这会阻止用户将程序输出重定向到文件,因为我明确地重新打开/dev/stdin。有人建议您可以使用/dev/fd/1代替/dev/stdin来缓解后一个问题,但我还没有对其进行测试。

似乎没有可靠的方法,例如, http://c-faq.com/stdio/undofreopen.html

答案 2 :(得分:0)

我不知道绝对解决方案,但您需要使用:

freopen("conout$", "w", stderr);

或类似的东西,但使用“conout $”伪文件,我认为这与Linux上的/dev/stdout相同。

您可能必须使用GetStdHandleAttachConsole

答案 3 :(得分:0)

如果你使用的是c ++ 11及以上版本,你可以使用一个简单的可变参数模板而不需要太多编码,所以这会对所有情况重载printf并且永远不会调用原始的

template <typename ...Args>
void printf(Args... ...)
{
}