2

サンプル:

namespace  boostio = boost::iostreams;
boostio::stream<boostio::array_source> memStream(arr);


while (!memStream.eof())
{
    char tst[2];

    memStream2.readsome(tst, 2);
}

ここでは memstream を char 配列で初期化していますが、while ループは決して終了しません。何が問題ですか ?

編集:ストリームの読み取りメソッドを使用すると、期待どおりに機能します。それ以外 (演算子 >> を含む) を使用しても問題ありません

4

2 に答える 2

2

readsome() をこのように使用することには、完全にオプションであるという一般的なコメントに加えて、2 つの問題があります。

  1. の目的は、readsome()への最後の呼び出しによって文字ソースからストリームの内部バッファに既に取り込まれたデータから、次の n バイトを取得することrdbuf()->underflow()です。ストリームが構築されるとき、(この場合) ソースからすぐに読み取ろうとはしません。そのバッファは空です。readsome() には何もありません。

    編集: 技術的には、この場合は (これも完全にオプション) にフォールバックしてshowmanyc()、データ ソースで利用可能なデータの量を調べますが、この実装でshowmanycはたまたま「わからない」(ゼロ) を返します。

  2. ストリーム バッファを (通常の read() や get() などで) 準備しても、ストリームのバッファの最後に到達したときに readsome はストリーム フラグを設定しません。ソース(showmanyc()語っていないため)。

以下は私のテストで動作します:

#include <iostream>
#include <complex>
#include <iomanip>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/array.hpp>

int main()
{
    namespace  boostio = boost::iostreams;

    char arr[10] = "example";
    boostio::stream<boostio::array_source> memStream(arr);

    char c;
    while(memStream.get(c)) // prime the buffer by reading 1 char
    {
        std::cout << c;
        char tst[2];
        while(memStream.readsome(tst, 2) > 0) // read some more
            for(int n = 0; n < memStream.gcount(); ++n)
                std::cout << tst[n];
    }
    std::cout << '\n';
}

よく見ると、iostreams はこれについてスマートであり、最初の char を読み取ると、ストリームバッファの内部ポインタが配列を直接指すようになるため、この場合、読み取りが残っているものはすべて readsome() から取得できます。

ここで、operator>> に関してmemStream >> setw(2) >> tst;は、間違ったループ条件 "while(!stream.eof())" を使用しているにもかかわらず、完全に問題なく動作します (配列で >> を使用するときに setw について覚えていてほしいと思います!!)。 . operator>> で発生した問題を示すテスト ケースを提供する必要があります。

于 2012-12-06T04:05:39.773 に答える