设想一下,我们在 win32 控制台下写了个在命令行运行的程序库,图方便直接用 printf 输出 log 来进行调试,但后来集成库时使用了 MFC 之类的窗体程序,于是原先用 printf 输出的 log 信息都看不到了,但是我们又需要查看这些 log 信息,甚至最好能输出到文件来方便进行分析,如何处理?
首先,我们考虑将 log 信息输出到控制台上,按照以下步骤操作。
1,添加头文件
|
#include <io.h>
#include <fcntl.h>
|
2,把下面的函数加到将要调用的文件中
|
void
InitConsoleWindow
(
)
{
AllocConsole
(
)
;
HANDLE
handle
=
GetStdHandle
(
STD_OUTPUT_HANDLE
)
;
int
hCrt
=
_open_osfhandle
(
(
long
)
handle
,
_O_TEXT
)
;
FILE
*
hf
=
_fdopen
(
hCrt
,
"w"
)
;
*
stdout
=
*
hf
;
}
|
3,在初始化函数中添加创建控制台的调用
|
BOOL
CHelloMFCDlg
::
OnInitDialog
(
)
{
CDialog
::
OnInitDialog
(
)
;
InitConsoleWindow
(
)
;
// add
printf
(
"str = %s
"
,
"Debug output goes to terminal
"
)
;
.
.
.
.
.
.
}
|
调用此函数后会弹出一个 Console,printf 的信息就会出现在这上面,我们就可以查看 log 信息了。但是,如果 log 信息输出过多,Console 上面就不能显示全部信息,这时我们便希望通过 printf 把 log 输出到一个固定的文件中,而这就要用到了输出的重定向。

我们都知道,在 windows 终端输入”dir”会列出当前目录的文件列表,输入”dir > 1.txt”则可把当前目录的文件列表导出到”1.txt”中,linux 终端也有类似命令”ls > 1.txt”。这里用到的就是输出的重定向,我们可以用同样的思路通过 freopen 来实现 log 信息的文件输出。
先包含头文件,然后一句话就可以实现输出的重定向
|
#include <stdio.h>
#include <stdlib.h>
freopen
(
"log.txt"
,
"w"
,
stdout
)
;
//redirect stdout to log.txt
|
返回正常的 stdout 输出
|
freopen
(
"CON"
,
"w"
,
stdout
)
;
//recover stdout(Windows)
//freopen("/dev/console", "w", stdout); //recover stdout(Linux)
|
也可以这样使用
|
FILE
*
outbak
=
stdout
;
stdout
=
fopen
(
"log.txt"
,
"w"
)
;
.
.
.
.
.
.
fclose
(
stdout
)
;
stdout
=
outbak
;
|
其实,stdin 也有类似的重定向操作:
|
freopen
(
"info.txt"
,
"r"
,
stdin
)
;
//redirect stdin to info.txt
freopen
(
"CON"
,
"r"
,
stdin
)
;
//recover(Windows)
//freopen("/dev/console", "r", stdin); //recover(Linux)
|
上面的方法都是在代码已经写完的情况下,通过对 printf 进行的调整来避免大量重复的劳动。当然,为了避免这一切,最好的方法是在最初写代码的时候就定义一个 log 输出宏,后续都通过这个宏来调整 log 输出。
原文地址:http://xuhehuan.com/2297.html