【问题标题】:g++ 4.6 bug with stringstream?带有字符串流的 g++ 4.6 错误?
【发布时间】: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


【解决方案1】:

我重新阅读了规范,最后我决定使用这段代码来检索字符串流管道中的可用字节:pipe.tellp()-pipe.tellg()。 据我所知,它符合所有要求,因此可以确保始终正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多