繁体   English   中英

将std:cout重定向到std :: ofstream,得到一个错误

[英]Redirect std:cout to std::ofstream , getting an error

我将标准输出数据重定向到std :: ofstream缓冲区,以将数据写入文件中。 以下代码实现了这一点,

if ( isActive ){
    try{
        std::string traceFileName = "traceLog"+getTime()+".log";
        std::ofstream out(traceFileName.c_str());
        std::streambuf *countbuf = std::cout.rdbuf();
        std::cout.rdbuf ( out.rdbuf() ) ;
        std::cout<<"buffer pointed\n"<<std::endl;
    }

当我在单个.cpp中实现上述代码时,它会执行并dada正在文件中写入。但是对于以下情况,

A( bool isActive){
if ( isActive ){
    try{
        std::string traceFileName = "traceLog"+getTime()+".log";
        std::ofstream out(traceFileName.c_str());
        std::streambuf *countbuf = std::cout.rdbuf();
        std::cout.rdbuf ( out.rdbuf() ) ;
        std::cout<<"buffer pointed\n"<<std::endl;
        }

然后从另一个.cpp函数调用A(true),我希望在整个c ++项目中调用A()之后再执行std :: cout <“ printing data \\ n”; 那里的数据将被打印到文件中。 但是我的代码编译良好,在运行时抛出以下错误,

(process:10365): GConf-WARNING **: Client failed to connect to the D-BUS daemon:

没有收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。

(进程:10365):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。

(进程:10365):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。 QGtkStyle无法检测到当前的GTK +主题。 Qt:会话管理错误:不支持指定的任何身份验证协议

但是如果我将以下代码放在main位置,

    std::string traceFileName = "traceLog"+getTime()+".log";
std::ofstream out(traceFileName.c_str());
std::streambuf *countbuf = std::cout.rdbuf();
std::cout.rdbuf ( out.rdbuf() ) ;

运行时,所有std :: cout数据都已写入文件中。 ut抛出以下错误。 我该如何解决这个错误。

enter code here(process:10777): GConf-WARNING **: Client failed to connect to the D-BUS daemon:

没有收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。

(进程:10777):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。

(进程:10777):GConf-WARNING **:客户端无法连接到D-BUS守护程序:未收到回复。 可能的原因包括:远程应用程序未发送答复,消息总线安全策略阻止了答复,答复超时到期或网络连接断开。 QGtkStyle无法检测到当前的GTK +主题。 Qt:会话管理错误:不支持指定的任何身份验证协议

问题在于,在离开创建文件流的作用域之前,不会还原您的缓冲区。 std::cout仍将保留指向最终尝试写入的缓冲区的指针。

我相信,一个选择是让out static ,另一个是创建重新分配原来的缓冲区一类std::cout被遗忘的范围时:

class buffer_restore
{
public:
    buffer_restore(std::ios& _ios)
        : ios(_ios)
        , sbuf(_ios.rdbuf())
    { }

    ~buffer_restore()
    {
        ios.rdbuf(sbuf);
    }
private:
    std::ios& ios;
    std::streambuf* sbuf;
};

这是一个如何使用它的示例:

{
    buffer_restore br(std::cout);

    std::ofstream out(traceFileName.c_str());
    std::streambuf* countbuf = std::cout.rdbuf(out.rdbuf());

} // std::cout's buffer is restored to the original when br was constructed

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM