将stdout / stderr重定向到UNIX c ++下的文件-再次

问题描述 投票:7回答:6

我想做什么

将stdout和stderr从c ++内部重定向到一个或多个文件

为什么需要它

我正在使用一个外部的,预编译的第三方库,该库会产生大量的输出,我想将其重定向到日志文件以保持控制台的清洁。

条件

兼容性不是问题,该代码只能在Unix系统上运行。重定向不仅应该影响c ++样式的打印(std :: cout <

到目前为止我尝试过的事情

我已经在stackoverflow上浏览了半天,阅读了类似问题的人的多个答案。在这些答案的帮助下,我可以将以下代码组合在一起:


#include <stdio.h>
#include <iostream>
#include <fcntl.h>
#include "unistd.h"

const int stdoutfd(dup(fileno(stdout)));

int redirect_stdout(const char* fname){
  fflush(stdout);
  int newstdout = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP |     S_IROTH);
  dup2(newstdout, fileno(stdout));
  close(newstdout);
}

int restore_stdout(){
  fflush(stdout);
  dup2(stdoutfd, fileno(stdout));
  close(stdoutfd);
  return stdoutfd;
}

int main(){
  redirect_stdout("/dev/null");
  std::cout << "invisible 1" << std::endl;
  restore_stdout();
  std::cout << "visible 1" << std::endl;
  redirect_stdout("/dev/null");
  std::cout << "invisible 2" << std::endl;
  restore_stdout();
  std::cout << "visible 2" << std::endl;
  return 0;
}

我希望看到的是:

visible 1
visible 2

我实际看到的内容

visible 1

即,首次使用此机制时,它可以工作-但是,如果再次使用,则无法恢复输出。有人可以向我指出我需要更改什么才能使该机制无限频繁地工作吗?

c++ c io file-descriptor io-redirection
6个回答
4
投票
如果想重新使用它,请不要在stdoutfd中关闭restore_stdout

3
投票
您是否正在寻找这样的东西:-

3
投票
除了afr0ckfreopen()答案外,我想说的是,在使用freopen()时,我们应该小心。一旦分配了新的目的地(此处为[['output.txt'

2
投票

1
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.