【问题标题】:Having a stream's streambuf persist beyond stream's destruction?让流的流缓冲区持续存在于流的破坏之外?
【发布时间】:2010-12-04 17:01:21
【问题描述】:

是否可以让流的streambuf 在其原始流的销毁后仍然存在?

streambuf* f() {
    ifstream my_stream;
    // ...
    return my_stream.rdbuf();
}

void g() {
    streambuf *s = f();
    // ...
    ifstream my_new_stream;
    my_new_stream.rdbuf( s );
}

即,我希望 f() 返回的指向 streambuf 对象的指针即使在 my_stream 超出范围后仍保持有效。稍后,我想将其他一些流的streambuf 设置为保存的streambuf

这可能吗?如果有,怎么做?

【问题讨论】:

  • 为什么要这样做?为什么不能只存储对 ifstream 本身的引用?
  • 如果 ifstream 超出范围,我仍然有同样的问题。
  • rdbuf 版本,它需要一个指向 streambuf 的指针,也返回以前使用的旧 streambuf,并且应该将所有权转移给你......也许这对你有用......但我不知道@ 987654329@ 有效.. 或者如果return stream.rdbuf(new stringbuf("leaks"))
  • 如果您查看 fstream(至少是 g++ 版本),它内部包含一个 streambuf 对象。当 fstream 消失时,streambuf 也会消失。我可以保留它的唯一方法是将其复制构造到一个新的 streambuf 对象中,但尚不清楚 streambuf 是否可复制构造(或便宜)。
  • @Paul J. Lucas:那就不要让它超出范围。我的意思是,在旧 filebuf 的基础上构建一个新的 ifstream 并没有比只使用旧的有任何优势。

标签: c++ iostream


【解决方案1】:

这是不可能的。 std::ifstream 构造、拥有和销毁其缓冲区。它通过rdbuf“导出”的唯一原因是允许重定向std::cin 等。在GNU 实现中,缓冲区是一个简单的成员(不是指针)。

std::ifstream 不会导出带有参数的rdbuf() 成员。它的父类之一确实如此,但这应该被rdbufstd::basic_ifstream 中的重新定义所掩盖

std::filebuf *rdbuf() const;

std::filebuf 也是不可复制的。

rdbuf(std::streambuf *) 成员可以通过强制转换为std::ios 来检索。使用它会导致熟悉的鼻恶魔。)

【讨论】:

    【解决方案2】:

    要获得您想要的,请自己创建和管理 filebuf/streambuf。您可以根据需要在 streambuf 上创建 istream 或 ostream。

    如下:

    #include <iostream>
    #include <fstream>
    #include <memory>
    #include <string>
    
    using namespace std;
    
    shared_ptr<streambuf> f()
    {
        auto ret = make_shared<filebuf>();
        if( !ret->open("filebuf-test.cpp", ios::in) )
            exit(1);
        return ret;
    }
    
    void g(streambuf *sb)
    {
        istream is(sb);
    
        string line;
    
        while(getline(is, line)) {
            cout << line << '\n';
        }
    }
    
    int main()
    {
        auto p = f();
        g(p.get());
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 2021-10-06
      • 2019-10-14
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多