我试图使用流来从现有数据的矢量中读取。
// 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和编译器一起使用。
答案 0 :(得分:0)
std::basic_streambuf::seekpos
会根据http://en.cppreference.com/w/cpp/io/basic_streambuf/pubseekpos
pos_type(off_type(-1))
istream::seekg()
以威胁为错误条件,因此您需要在类vectorwrapbuf
中覆盖该函数并返回实际位置。