2011-12-08 53 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()。 据我所知,它符合所有要求,所以它可以确保始终工作。