【发布时间】:2011-12-08 12:04:51
【问题描述】:
我过去曾在单个线程中使用 stringstream 作为管道(使用 g++ 4.5),没有问题。现在我尝试了同样的方法,但我无法让它在 g++ 4.6 中工作:问题是内部的streambuf 永远不会超过第一个字节。
考虑这段代码
#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 存在一些缺陷。
附: 我使用带有关联 stringbuf 的 iostream 得到了相同的结果,这基本上就是 stringstream 所做的。
【问题讨论】:
-
看起来
readsome只读取一个字节,据我所知,这是正确的行为。如果您想准确读取 4 个字节,请使用read。 -
是的,但事实是这段代码适用于 g++ 4.5,因为 streambuf 对象的 in_avail() 方法返回了正确的字节数 (4)。现在,它返回 always 1,因此 readsome() 仅读取 1 个字节,即使它可以读取 4。在我的应用程序中,我必须提前知道我可以读取多少字节。
-
我使用的是 GCC 4.4.5,
in_avail也为我返回 1。因此,如果它是一个错误,那么它已经很老了。我无法访问 4.5 的 gcc,所以现在无法测试。 -
看起来他们在 4.6 中更改了实现。但是,它仍然是正确的。
readsome最多可读取 n 个字符。不能保证它会读取超过 1。
标签: gcc g++ iostream stringstream