2011-12-08 10 views
0

私は過去に(g ++ 4.5で)問題のない単一のスレッド内でパイプとしてstringstreamを使用しました。今私は同じアプローチを試みましたが、g ++ 4.6で動作するようにはできません:内部のstreambufは最初のバイトを超えて決して満たされないという問題があります。g ++ 4.6 stringstreamのバグ?

このコード

#include <iostream> 
#include <sstream> 
using namespace std; 

int main(){ 
     stringstream pipe(ios_base::in|ios_base::out|ios_base::binary); 
     const char* in="lol"; 
     pipe.write(in, 4); 
     char out[4]={0}; 
     cout<<pipe.readsome(out, 4)<<" "<<out<<endl; 
} 

これは予期せず、 "1 L" を出力し検討します。

stringstreamの使用に明らかなエラーはありますか?さもなければ、私はg ++ 4.6 STLにいくつかの欠陥があると結論づけなければなりません。

P.S. iostreamと関連するstringbufを使用して同じ結果が得られます。これは基本的にstringstreamの機能です。

+0

'readsome'は1バイトしか読まないようですが、理解できる限り正しい動作です。正確に4バイトを読みたい場合は 'read'を使います。 –

+0

はい、実際には、streambufオブジェクトのin_avail()メソッドが正しい量のバイト(4)を返したため、このコードはg ++ 4.5で動作しました。今度は* always * 1を返しますので、readsome()は4バイトを読み込めても1バイトしか読み込みません。私のアプリケーションでは、読み込めるバイト数を事前に知っておく必要があります。 –

+0

私はGCC 4.4.5を使用しています。また、 'in_avail'も私のために1を返します。だから、それがバグであれば、それはかなり古いです。私はgccの4.5にアクセスできないので、今すぐテストすることはできません。 –

答えて

0

仕様を再読み込みし、最後にこのコードを使用してstringstreamパイプの利用可能なバイト:pipe.tellp()-pipe.tellg()を取得することにしました。 私が知る限り、それはすべてに準拠しているので、常に働くことが保証されています。