2011-12-08 49 views
0

我已經在過去的單線程中使用stringstream作爲管道(使用g ++ 4.5),沒有問題。現在我嘗試了相同的方法,但是我無法在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升」。

在使用stringstream時是否有任何明顯的錯誤?否則,我必須得出結論,g ++ 4.6 STL存在一些缺陷。

P.S. 我使用帶有關聯字符串的iostream的結果相同,這基本上是stringstream所做的。

+0

它看起來像'readsome'只能讀取一個字節,據我所知,它是正確的行爲。如果你想讀取完整的4個字節,使用'read'。 –

+0

是的,但事實是此代碼與g ++ 4.5一起工作,因爲streambuf對象的in_avail()方法返回了正確數量的字節(4)。現在,它返回* always * 1,所以readsome()只讀取1個字節,即使它可以讀取。4.在我的應用程序中,我必須事先知道可以讀取多少個字節。 –

+0

我使用GCC 4.4.5,'in_avail'也爲我返回1。所以,如果這是一個錯誤,那麼它已經很老了。我無法訪問gcc的4.5,所以現在無法測試。 –

回答

0

我重新閱讀規範,最後決定使用這段代碼來檢索stringstream管道中的可用字節:pipe.tellp()-pipe.tellg()。 據我所知,它符合所有要求,所以它可以確保始終工作。