2009-11-19 94 views
5

有没有办法在代码中重定向C++输出? 情况是这样的,我正在使用一些外部的.cpp和.h文件,它们使用printf将警告发送到控制台。我希望只将这些输出(不是我的)“重定向到一个文件”没有“修改他们的代码。C++重定向输出

所以;在我的程序中,我可以将输出重定向到一个文件,并且当我将一些输出重定向到默认控制台时,之后再重新生成文件,等等......

这可能吗?

回答

7

你可以在stdout上使用freopen()将stdout重定向到一个文件。

+0

+1为做标准兼容(和便携)的事情。 – DevSolar 2009-11-19 14:46:44

+0

是否在程序结束前以某种方式执行?我需要以某种方式将其转换回控制台吗? – 2009-11-19 17:42:33

1

printf将打印到文件描述符1,您可以关闭它并打开一个文件,这会给你另一个fd,可能是1,因为它的最低fd可用,如果不是你不够快。

如果你只是close(1);然后int fd = open(file);如果在close和open之间没有打开任何东西,fd应该是1。此时,任何输出到fd号码1的人都将打印到您的文件。

这是因为系统应该给你lowest available file descriptor number所以它会给你1,这正是printf写入的地方。

由于@roe提到你可能更喜欢首先做一个dup(),以获得另一个可以打印到标准输出的fd数字。

+0

如果你想继续打印你自己的东西来标准输出,你应该先'dup()'。然后你可以用'dup2()'来回切换。 – falstro 2009-11-19 14:44:29

+0

或直接写入你自己的数据到被骗的FD ...我想这会更好。仍然需要重复它。 – falstro 2009-11-19 14:45:02

+0

当然,假设一个POSIX系统,即使这样,你在做重新打开()完全符合法案的潜在危险的事情。 C库和POSIX 混合不好。我会一直保持open()/ read()/ write()/ close()和fopen()/ fread()/ fwrite()/ fclose()。 – DevSolar 2009-11-19 14:46:08