将std::cout的副本重定向到文件

8

我需要将 std::cout 的副本重定向到文件中,即我需要在控制台和文件中看到输出。如果我使用以下代码:

// redirecting cout's output
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  streambuf *psbuf, *backup;
  ofstream filestr;
  filestr.open ("c:\\temp\\test.txt");

  backup = cout.rdbuf();     // back up cout's streambuf

  psbuf = filestr.rdbuf();   // get file's streambuf
  cout.rdbuf(psbuf);         // assign streambuf to cout

  cout << "This is written to the file";

  cout.rdbuf(backup);        // restore cout's original streambuf

  filestr.close();

  return 0;
}

我将字符串写入文件,但在控制台上看不到任何内容。该怎么办?


11
使用tee或类似工具在外部处理这个操作可能更简单(而且也许更合适)。详见:http://unixhelp.ed.ac.uk/CGI/man-cgi?tee - NPE
2
@NPE:这假设该进程在可行的上下文中运行。但并非总是如此。 - Oliver Charlesworth
1
当有人询问C++的“iostreams”时,你回答一个UNIX特定的C函数,这会导致@NPE错误。 - rubenvb
我现在使用的是Windows操作系统。 - Andrey Bushman
3个回答

13

您可以做的最简单的事情是创建一个输出流类,它可以执行以下操作:

#include <iostream>
#include <fstream>

class my_ostream
{
public:
  my_ostream() : my_fstream("some_file.txt") {}; // check if opening file succeeded!!
  // for regular output of variables and stuff
  template<typename T> my_ostream& operator<<(const T& something)
  {
    std::cout << something;
    my_fstream << something;
    return *this;
  }
  // for manipulators like std::endl
  typedef std::ostream& (*stream_function)(std::ostream&);
  my_ostream& operator<<(stream_function func)
  {
    func(std::cout);
    func(my_fstream);
    return *this;
  }
private:
  std::ofstream my_fstream;
};

在此ideone链接中查看此代码的执行情况:http://ideone.com/T5Cy1M 目前我无法检查文件输出是否正确,但这不应该是一个问题。


3

我尝试在Visual Studio中使用您的代码,但是这个IDE不认识这些头文件。 :( - Andrey Bushman
@Bush你需要安装和设置boost(参见www.boost.org),或者使用不需要boost的方法。 - rubenvb

1

你的代码无法正常工作,因为是 streambuf 确定了流输出的位置,而不是流本身。

C++ 没有任何支持将输出定向到多个目标的流或 streambuf,但你可以自己编写一个。


你的代码无法正常工作,因为它是streambuf决定了流输出的位置,而不是流本身。不,这段代码在Windows上运行良好。我从http://www.cplusplus.com/reference/ios/ios/rdbuf/页面获取了它。 - Andrey Bushman
@Bush:它不起作用的意思是它不能做你想要它做的事情。 - Bart van Ingen Schenau

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