2011-07-20 1 views
5

生メモリバッファから直接読み取るistreamを作成しようとしています。istream :: tellg()は、私のカスタムstreambufクラスで使用すると-1を返します。

私はここに別のポストでこれを行うには良い方法を見つけました:

class membuf : public basic_streambuf<char> 
    { 
    public: 
     membuf(char* p, size_t n) { 
      setg(p, p, p + n); 
     } 
    }; 

は、その後、私はこのmembuf使用して私のistreamを作成します。

membuf mb(dataPointer, dataLength); 
    istream reader(&mb); 

を私はその後、getline()>>演算子を使用して読んで、すべてが素晴らしいです。しかし、seekg()を使用してバッファの先頭に巻き戻すことはできません。​​は常に-1を返します。

これを機能させるには、もっとコードを書く必要がありますか、それとも失敗するのでしょうか?

+0

seekg()は巻き戻していませんか? 'tellg()'が正しく動作することを証明しましたか? –

+0

はい、seekg(0)を呼び出した後、getline()は私の最初の行を読みません。 tellg()関数は、(バッファから読み込みを始めたばかりであっても)常に-1を返すので、正しく動作しません。私はボーの答えはここに行く方法だと思う... – EdSanville

+0

E @ dSanville:OK;私はそれに応じてあなたの質問を明確にしました。 –

答えて

6

関数tellgとseekgは、保護された仮想関数seekoffseekposに依存し、membufクラスに実装する必要があります。

basic_streambufのデフォルト値は、すべての呼び出しでpos_type(off_type(-1))を返します(多くの実装では-1に等しい)。

+0

ありがとうございます!私はすぐにそれらを実装します。私は不思議ですが、istream :: tellg()はどのようにそれらの関数を使用しますか? streambuf :: seekoff(0、ios_base :: cur)を呼び出して戻り値を取得しますか? – EdSanville

+0

実際には、はい。実際にはpubseekoffが呼び出され、seekoffが呼び出されますが、これはインターフェイスデザインの詳細です。 :-) –

+0

私はこれをやろうとしています...カスタムのmembufクラスに 'seekoff'と' seekpos'を実装しました。私のコードに問題があります。 'seekoff'は' tellg'と 'seekposによって一貫して呼び出されていません'はまったく呼び出されません。任意の提案または実際の例? –

関連する問題