写入终端和文件C



我发现了为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(如果那会有所不同)。

预先感谢!

可能的解决方案:使用静态流式cout状对象写入cout和file。

粗略的示例:

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;
}

不过,您可能需要明确处理流动机。

这是我的库实施。

一步一步没有内置的方式来执行此操作。您必须将数据写入文件,然后分两个步骤将数据写出。

您可以编写一个函数,该功能接收数据和文件名,并为您提供此功能,以节省时间,某种记录功能。

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

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

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

在代码的逻辑中,您只需输出消息,在此级别上,不需要知道将如何处理它。在我的模型中,您可以首先检查是否有任何"侦听器",因为这比构建和输出消息更便宜,而消息最终只会出现在/dev/null中(好吧,您知道我的意思是什么)。

这样做的一种方法是写一个小包装器来做到这一点,例如:

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 iDiom(https://en.wikipedia.org/wiki/wiki/Resource_acquesition_is_initialization)

使用它:

DoubleOutput mystream("myfile");
mystream << "Hello World";

相关内容

  • 没有找到相关文章

最新更新