C ++:std :: istream读取及其对std :: streambuf下溢的调用

时间:2012-06-14 16:52:48

标签: c++ istream streambuf

以下代码仅测试在underflow上使用std::istream read时调用std::stringbuf的频率。

#include <iostream>
#include <vector>
#include <sstream>

class TestStringBuf : 
public std::stringbuf
{
public:

    int_type underflow()
    {
        std::cout<<"TestStringBuf underflow"<<std::endl;
        return std::stringbuf::underflow();
    }
};

int main(int argc, const char * argv[])
{
    TestStringBuf buf;
    std::iostream stream(&buf);

    stream << "tesr";

    std::vector<char> data(4);
    stream.read(&data[0], 4);

    for(int i=0; i<data.size(); ++i)
        std::cout<<data[i];
    std::cout<<std::endl;

    return 0;
}

输出是:

TestStringBuf underflow
TestStringBuf underflow
test

我预计只会调用一次下溢,因为我确切地读取了get区域中存在的字节数,那为什么它会再次下溢呢?这是预期的行为吗? 我问,因为我的自定义underflow方法可能会长时间阻止读取新数据,因此在这种情况下,第二次调用underflow并不是很理想。

我使用 clang 3.1 libc ++ 进入Osx。

谢谢!

更新

我刚做了一个完全独立的测试,在我看来,这在 libc ++ 实现中很奇怪,因为 libstd ++ 不会发生这种情况。有人可以用其他实现来测试吗?这是一个错误还是只是一个实现差异(对我来说感觉很糟糕)。我更新了上面的代码,因此您可以将其复制并粘贴到任何main.cpp中。

UPDATE2:

毕竟这是libc ++中的一个错误,请参阅:http://llvm.org/bugs/show_bug.cgi?id=13113。如果您自己编译libc ++,那么错误就应该消失了,我会尽快尝试。

1 个答案:

答案 0 :(得分:0)

C ++标准明确允许std :: basic_stringbuf的实现将字符序列存储在std :: basic_string中,而不是使用std :: basic_streambuf的内部缓冲区。