2010-12-04 4 views
2

は、それがストリームのstreambufは、その元のストリームの破壊の破壊後も持続することは可能ですか?ストリームの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に設定したいとします。

これは可能ですか?もしそうなら、どうですか?

+2

あなたがこれを行うにはしたくないのはなぜ? 'ifstream'自体への参照を保存するだけの理由はありませんか? – casablanca

+0

ifstreamが範囲外になっても、私はまだ同じ問題を抱えています。 –

+0

ストリームバッファへのポインタを取るRDBUFバージョンも、前に使用し、古いストリームバッファを返し、あなたに所有権を転送する必要があります...多分あなたのために働く...しかし、私は '(0)stream.rdbufを返す場合は知りません; '動作します。..またはあなたが(少なくともG ++バージョンの)fstreamのを見れば、' ' – smerlin

答えて

2

それは不可能です。 std::ifstream構造体は、そのバッファを所有し、破棄します。それはrdbuf介して「エクスポート」の唯一の理由は、バッファは、単純な部材(ないポインタ)であり、GNU実装でstd::cin等のリダイレクトを可能にすることです。

std::ifstreamは、引数でrdbuf()メンバーをエクスポートしません。その親クラスのひとつはありませんが、これは、署名

std::filebuf *rdbuf() const; 

std::filebufstd::basic_ifstreamrdbufの再定義によって陰にする必要があり、また、非コピー可能です。自分のためたfilebuf /ストリームバッファを、あなたが望む結果を得る作成し、管理する

rdbuf(std::streambuf *)メンバーがstd::iosにキャストすることにより取得することができます。これを使用すると、おなじみの鼻悪魔の原因となります。)

1

。 streambufに必要なときにistreamsまたはostreamsを作成することができます。次のような

#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; 
} 
関連する問題