2015-09-16 46 views
0

我正在嘗試使用流來從現有數據的向量中讀取數據。seekg在使用自定義流緩衝區時使用istream不起作用

// 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://en.cppreference.com/w/cpp/io/basic_streambuf/pubseekpos

istream::seekg()爲了威脅的錯誤條件 http://ideone.com/PfpW0o

回答

0

std::basic_streambuf::seekpos默認返回pos_type(off_type(-1)),所以你需要重寫功能,在您的vectorwrapbuf類,並返回實際位置。

+1

好的謝謝。你能建議我怎麼做,或者它不簡單? –

+0

@NeilKirk看起來像需要驗證輸入,用適當的位置調用'setg()'並返回第一個參數。 – Slava

相關問題