5

我发现这个问题是针对 Python、Java、Linux 脚本而不是 C++ 回答的:

我想将我的 C++ 程序的所有输出都写入终端和输出文件。使用这样的东西:

int main ()
{
freopen ("myfile.txt","w",stdout);
cout<< "Let's try this"; 
fclose (stdout);
return 0;
}

仅将其输出到名为“myfile.txt”的输出文件,并防止其显示在终端上。我怎样才能让它同时输出到两者?我使用 Visual Studio 2010 Express(如果这有什么不同的话)。

提前致谢!

4

4 回答 4

8

可能的解决方案:使用静态流 cout-like 对象同时写入 cout 和文件。

粗略的例子:

struct LogStream 
{
    template<typename T> LogStream& operator<<(const T& mValue)
    {
        std::cout << mValue;
        someLogStream << mValue;
    }
};

inline LogStream& lo() { static LogStream l; return l; }

int main()
{
    lo() << "hello!";
    return 0;
}

不过,您可能需要显式处理流操纵器。

这是我的库实现。

于 2014-01-20T11:18:51.723 回答
1

没有内置的方法可以一步完成。您必须将数据写入文件,然后分两步将数据写入屏幕。

您可以编写一个函数来接收数据和文件名并为您执行此操作,以节省您的时间,某种日志记录功能。

于 2014-01-20T11:17:17.870 回答
1

我有一种方法可以做到这一点,它基于订阅者模型。

在此模型中,您的所有日志记录都转到“日志记录”管理器,然后您有“订阅者”来决定如何处理消息。消息有主题(对我来说是一个数字),记录器订阅一个或多个主题。

出于您的目的,您创建了 2 个订阅者,一个输出到文件,一个输出到控制台。

在您的代码逻辑中,您只需输出消息,在此级别不需要知道将要使用它做什么。在我的模型中,尽管您可以先检查是否有任何“侦听器”,因为这被认为比构建和输出仅以 /dev/null 结尾的消息更便宜(你知道我的意思)。

于 2014-01-20T11:21:25.373 回答
0

一种方法是编写一个小包装器来执行此操作,例如:

class DoubleOutput
{
public:
  // Open the file in the constructor or any other method
  DoubleOutput(const std::string &filename);   
  // ...
  // Write to both the file and the stream here
  template <typename T>
  friend DoubleOutput & operator<<(const T& file);
// ...
private:
  FILE *file;
}

拥有一个类而不是一个函数会让你使用 RAII 成语(https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization

要使用它:

DoubleOutput mystream("myfile");
mystream << "Hello World";
于 2014-01-20T11:21:36.190 回答