我有一个Windows GUI应用程序,使用第三方库将调试/错误信息输出到stdout/stderr。我发现了许多重定向它们到我的日志文件的解决方案,但只有 1.5 / 4 可以按照预期工作。我在WinXP SP3 32位上使用VS 2008 SP1。我没有包含错误处理,但是没有任何调用返回错误。
// First one:
SetStdHandle(STD_OUTPUT_HANDLE, (HANDLE)_get_osfhandle(_fileno(log_file.get_FILE())));
SetStdHandle(STD_ERROR_HANDLE, (HANDLE)_get_osfhandle(_fileno(log_file.get_FILE())));
printf("%s", "1 Test printf to cout!\n");
fprintf(stderr, "%s", "1 Test printf to cerr!\n");
std::cout << "1 Test print to cout!\n";
std::cerr << "1 Test print to cerr!\n";
fflush(stdout);
fflush(stderr);
// Second one:
_dup2(_fileno(log_file.get_FILE()), _fileno(stdout));
_dup2(_fileno(log_file.get_FILE()), _fileno(stderr));
printf("%s", "2 Test printf to cout!\n");
fprintf(stderr, "%s", "2 Test printf to cerr!\n");
std::cout << "2 Test print to cout!\n";
std::cerr << "2 Test print to cerr!\n";
fflush(stdout);
fflush(stderr);
// Third one:
std::ofstream out_stream(log_file.get_FILE());
std::cout.rdbuf(out_stream.rdbuf());
std::cerr.rdbuf(out_stream.rdbuf());
printf("%s", "3 Test printf to cout!\n");
fprintf(stderr, "%s", "3 Test printf to cerr!\n");
std::cout << "3 Test print to cout!\n";
std::cerr << "3 Test print to cerr!\n";
fflush(stdout);
fflush(stderr);
// Fourth one:
*stdout = *log_file.get_FILE();
*stderr = *log_file.get_FILE();
printf("%s", "4 Test printf to cout!\n");
fprintf(stderr, "%s", "4 Test printf to cerr!\n");
std::cout << "4 Test print to cout!\n";
std::cerr << "4 Test print to cerr!\n";
fflush(stdout);
fflush(stderr);
在我进行测试后(当然是分别测试),我得到了以下结果:
3 将输出打印到cout!
3 将输出打印到cerr!
4 将printf输出到cout!
4 将输出打印到cout!
4 将printf输出到cerr!
4 将输出打印到cerr!
为什么只有最后一个解决方案能完全工作?使用它是否安全?
更新。XCode测试结果:
2 将printf输出到cout!
2 将输出打印到cout!
2 将printf输出到cerr!
2 将输出打印到cerr!
4 将printf输出到cout!
4 将输出打印到cout!
4 将printf输出到cerr!
4 将输出打印到cerr!
第一个显然只适用于Windows,第三个因为没有接受FILE*参数的文件流构造函数而失败。