我已经编写了 gzstream 1.5 的简单包装器,用于与 rapidjson 0.1(ios,xcode 6.1)一起使用。
问题:我必须在 Peek() 和 Take() 中检查 eof。否则,我将 '\377' (-1) 作为最后一个字符。我知道它是由 std::basic_stream::get() 在 eof 返回的。
有什么更优雅、正确和干净的解决方案?
class GzOutStream {
public:
GzOutStream(std::string filename) : gs_(new ogzstream(filename.c_str())) {}
bool Good() { return gs_->good(); }
void Close() { delete gs_; gs_ = nullptr; }
size_t Tell() { return gs_->tellp(); }
void Put(char c) { gs_->put(c); }
// Not implemented
char* PutBegin() { return 0; }
size_t PutEnd(char*) { return 0; }
private:
ogzstream* gs_;
};
class GzInStream {
public:
GzInStream(std::string filename) : gs_(new igzstream(filename.c_str())) {}
bool Good() { return gs_->good(); }
void Close() { delete gs_; gs_ = nullptr; }
char Peek() { return gs_->eof()? '\0' : gs_->peek(); }
char Take() { return gs_->eof()? '\0' : gs_->get(); }
size_t Tell() { return gs_->tellg(); }
void Put(char c) { } // Stab
// Not implemented
char* PutBegin() { return 0; }
size_t PutEnd(char*) { return 0; }
private:
igzstream* gs_;
};