C++ 将std:cout重定向到std::of流,获取错误

C++ 将std:cout重定向到std::of流,获取错误,c++,qt,security,azure,c++11,C++,Qt,Security,Azure,C++11,我将标准输出数据重定向到std::ofstream缓冲区,以便将数据写入文件。下面的代码实现了这一点 if ( isActive ){ try{ std::string traceFileName = "traceLog"+getTime()+".log"; std::ofstream out(traceFileName.c_str()); std::streambuf *countbuf = std::cout.rdbuf();

我将标准输出数据重定向到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;
    }
没有收到答复。可能的原因包括:远程应用程序未发送回复、消息总线安全策略阻止了回复、回复超时过期或网络连接中断

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

(进程:10365):GConf警告**:客户端未能连接到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警告**:客户端未能连接到D-BUS守护进程: 没有收到答复。可能的原因包括:远程应用程序未发送回复、消息总线安全策略阻止了回复、回复超时过期或网络连接中断

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

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

我认为一个选项是使
变为
静态
,另一个选项是创建一个类,在离开作用域时将原始缓冲区重新分配给
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

函数退出时,函数变量将被销毁
cout
在发生这种情况之前永远不会恢复到其原始状态,并且正在使用一个不再存在的缓冲区,因为
ostream
也会被销毁。这是我唯一能想到的atm。我有一个.cpp文件,我在这个项目中实现了我的。我想要的是,在我的项目中,std::cout所在的任何地方,它都会打印文件中的数据,并带有时间戳。@user2422669然后您可能希望使文件流
静态
,或者使用命令行重定向(例如,在linux
main.cpp>>file.txt中)。我相信你之前已经得到了一个答案,告诉你如何制作时间戳。你在实现这一点上有困难吗?
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