2011-05-09 297 views
7

我工作的一个程序,使大量使用的“COUT < < strSomething;”将信息记录到控制台。我需要修改程序,以便所有控制台输出都转到控制台和文件。虽然我可以修改“COUT < <”在我们的代码,有一些还可以使用“COUT < <”几家大型的第三方库;这些库因其许可而无法修改 - 因此修改对“cout < <”的所有引用不是一个解决方案。此外,由于执行命令行的方式,不可能使用“wtee.exe”。自定义C++的cout类 - 输出到控制台和日志文件

我使用Visual Studio 2008年。我已经看到了在Google Groups: redirect cout to file张贴,这似乎做的正是我想做的事情。唯一的问题是代码不会编译。在 - > overflow()和 - > sync()方法调用中,我得到C2248错误“无法访问受保护的成员”。

有没有人知道如何得到这个代码编译?或者同时将cout重定向到控制台和文件的替代方法?

+0

复制的一生中,我认为:HTTP:/ /stackoverflow.com/questions/1760726/compose-output-streams – GManNickG 2011-05-09 20:49:28

+0

(同时包含加速和非加速解决方案。) – GManNickG 2011-05-09 20:49:40

+0

聪明和简单的解决方案在这里:HTTP://计算器。com/a/13978705/2662901 – feetwet 2015-07-08 20:02:46

回答

1

sync呼叫可以与pubsync代替。至于overflow电话,我认为这可能是一个错字。因为它看起来应该是对sputc的呼叫。

+0

将“sync”更改为“pubsync”编译。但更改为“溢出”到“putc”失败。错误C2039'putc'不是std :: basic_streambuf <_Elem的成员,_Traits> – 2011-05-09 21:30:12

+0

对不起,这是一个错字。在我的答案中。我纠正它到'sputc'。 – Troubadour 2011-05-09 21:32:26

+0

在我们的情况下(无法使用Boost,无法修改第三方库),这是最好的解决方案。 – 2011-05-09 21:44:18

2

如果你绝望:

#define protected public 
#include <iostream> 
#undef protected 

这是一个总的黑客,但它通常工作。

+8

我想吐了。 – Maxpm 2011-05-09 21:12:41

+0

在这一点上,我非常渴望采取甚至一个丑陋的黑客。不幸的是,对于VS2008,它并没有帮助。相同的原始错误。 – 2011-05-09 21:32:19

0

你可以只使用一个包装类的话,财产以后这样

#include <iostream> 
#include <fstream> 

... 

class streamoutput 
{ 
    std::ofstream fileoutput; 
    public: 
    streamoutput(char*filename){ 
     fileoutput.open(filename); 
    } 
    ~streamoutput(){ 
     fileoutput.close(); 
    } 
    template<class TOut> streamoutput& operator <<(const TOut& data) 
    { 
     fileoutput << data; 
     std::cout << data; 
     return this; 
    } 
}; 

extern streamoutput cout("logfile.log"); 

声明COUT这样的,只是改变你所有的#include <iostream>包括这个包装(remeber COUT是外部变量,所以你必须declere它也在你的一个源代码中)。

+0

这将适用于我们编写的代码,我们是否可以修改我们的#include 行。但是这对第三方代码无效,它也必须使用#include ,但我们不能因许可而修改。 – 2011-05-09 21:27:16

+0

然后您可以改为修改iostream文件!没有lisence可以阻止你!但是如果你有一个预编译的代码,这是一个不同的故事,但你也可以编写一个运行你的包装程序,并为你做所有的控制台。尽管它会花费更多的精力! – Ali1S232 2011-05-09 21:43:35

12

boost::iostreams::tee_device为该

#include <boost/iostreams/stream.hpp> 
#include <boost/iostreams/tee.hpp> 

#include <fstream> 
#include <iostream> 

int 
main() 
{ 
    typedef boost::iostreams::tee_device<std::ostream, std::ofstream> Tee; 
    typedef boost::iostreams::stream<Tee> TeeStream; 

    std::ofstream file("foo.out"); 
    Tee tee(std::cout, file); 

    TeeStream both(tee); 

    both << "this goes to both std::cout and foo.out" << std::endl; 

    return 0; 
} 

样品调用制成:

samm$ ./a.out 
this goes to both std::cout and foo.out 
samm$ cat foo.out 
this goes to both std::cout and foo.out 
samm$ 
+0

这对我来说很好 - 不幸的是,我被要求不包括Boost作为这个应用程序的一部分。管理,非技术性的决定。所以 - 你如何做到这一点? – 2011-05-09 21:25:35

+0

@Jason它看起来有一些其他答案不使用提升。祝你好运。 – 2011-05-09 21:50:54

1

你可以做的是一个指针捕捉到std::cout.rdbuf()std::streambuf, 那么我认为你应该能够将所有输出写入std::cout一些文件。

相关问题