当使用自定义streambuf的istream时,seekg不起作用

时间:2015-09-16 21:01:44

标签: c++

我试图使用流来从现有数据的矢量中读取。

// http://stackoverflow.com/questions/8815164/c-wrapping-vectorchar-with-istream
template<typename CharT, typename TraitsT = std::char_traits<CharT> >
class vectorwrapbuf : public std::basic_streambuf<CharT, TraitsT>
{
public:
    vectorwrapbuf(std::vector<CharT> &vec)
    {
        this->setg(&vec[0], &vec[0], &vec[0] + vec.size());
    }
};

int main()
{
    vector<char> data(100, 1);
    vectorwrapbuf<char> databuf(data);
    std::istream file(&databuf);
    file.exceptions(std::istream::failbit | std::istream::badbit);
    file.seekg(10); // throws
}

然而,当我调用seekg时,它会抛出异常(或者如果不使用异常则报告错误)。为什么是这样? 10在输入数据的100个字符内。

代码需要与C ++ 11和编译器一起使用。

实例: http://ideone.com/PfpW0o

1 个答案:

答案 0 :(得分:0)

默认情况下,

std::basic_streambuf::seekpos会根据http://en.cppreference.com/w/cpp/io/basic_streambuf/pubseekpos

返回pos_type(off_type(-1))

istream::seekg()以威胁为错误条件,因此您需要在类vectorwrapbuf中覆盖该函数并返回实际位置。