在C++中将标准输出和标准错误重定向到同一个文件

3

如何在C++中将标准输出和标准错误重定向到一个文件?

我尝试过的方法是:


if((LogStream = freopen(strFilePath.c_str(), "w", stdout)) == NULL)
{
    cout << "Failed to redirect console logs\n";
}
if((LogStream = freopen(strFilePath.c_str(), "a", stderr)) == NULL)
{
    cout << "Failed to redirect console logs\n";
}

但是它没有按照我预期的那样工作。

提前致谢。


2
你可以在运行时使用 >> file.log 2>&1 将其重定向。 - Fantastic Mr Fox
2
"不像我预期的那样工作。" 这里没有有用的信息。你观察到了什么?你期望观察到什么? - n. m.
期望之外的问题是什么。只有在无法打开文件时,"Failed to redirect console logs\n"; 才会被打印出来。尝试在 if 块后添加一行代码,以检查文件是否已正确打开。 - Singh
操作系统可能不允许您同时写入打开的文件两次。如果这样做,我也不会期望出现魔法。 - M.M
1个回答

5
以下是如何更改每个原始文件/C缓冲文件/C++缓冲流的方法:
#include <unistd.h>
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int main() {
  // unbuffered system-call level write() access:
  ::fclose(stderr);
  if (::dup2(STDOUT_FILENO, STDERR_FILENO) == -1) {
    cout << "dup2() failed!" << endl;
    return -1;
  }
  char msg_err[] = "write(STDERR_FILENO) OK.\n";
  char msg_out[] = "write(STDOUT_FILENO) still OK.\n";
  write(STDERR_FILENO, msg_err, strlen(msg_err));
  write(STDOUT_FILENO, msg_out, strlen(msg_out));

  // buffered C-style access: (ordering may be weird w/o fflush())
  stderr = ::fdopen(STDOUT_FILENO, "a");
  fprintf(stderr, "fprintf(stderr) OK.\n");
  fprintf(stdout, "fprintf(stdout) still OK.\n");

  // buffered C++ access:
  std::cerr.rdbuf(std::cout.rdbuf());
  cerr << "cerr << OK.\n";
  cout << "cout << still OK.\n";
}

那么,从调用的 shell 中执行此操作仍然更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接