【问题标题】:Redirect std:cout to std::ofstream , getting an error将 std:cout 重定向到 std::ofstream ,出现错误
【发布时间】:2014-04-03 04:45:22
【问题描述】:

我将标准输出数据重定向到 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 中实现上述代码时,itgeting 被执行,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

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

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

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

(process: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:

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

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

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

【问题讨论】:

  • 您的函数变量在函数退出时被销毁。cout 在此之前永远不会恢复到其原始状态,并且正在使用一个不再存在的缓冲区,因为 ostream 也被销毁了。这是我唯一能想到的atm..

标签: c++ qt security azure c++11


【解决方案1】:

问题是您的缓冲区在离开创建文件流的范围之前没有被恢复。 std::cout 仍将持有指向它最终尝试写入的缓冲区的指针。

我相信一种选择是使outstatic,另一种是创建一个类,在离开范围时将原始缓冲区重新分配给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

【讨论】:

  • 我有一个 .cpp 文件,我在这个项目下实现了我的。我想要的是,在我的项目中 std::cout 所在的任何位置,它都会在文件中打印数据,并带有时间戳。
  • @user2422669 然后你可能想要制作文件流static,或者使用命令行重定向(例如,在linux中main.cpp &gt;&gt; file.txt)。我相信您之前已经得到了一个答案,该答案告诉您如何制作时间戳。您在实施时遇到困难吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2018-12-13
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
相关资源
最近更新 更多