JAVA 自定义解析stream_c – 如何为自定义istream / streambuf实现seekg()?

我认为通过“seekg”你的意思是

seekoff和

seekpos.

实现COMStreambuf的成员搜索和搜索的直接方法是包装IStream接口的Seek方法.例如,这样的东西应该工作:

// COMStreambuf.cpp

COMStreambuf::pos_type COMStreambuf::seekoff(COMStreambuf::off_type off_, std::ios_base::seekdir way_, std::ios_base::openmode which_)

{

union {

LARGE_INTEGER liMove;

ULARGE_INTEGER uliMove;

};

liMove.QuadPart = off_;

DWORD dwOrigin = STREAM_SEEK_SET;

if (way_ == std::ios_base::cur) {

dwOrigin = STREAM_SEEK_CUR;

} else if (way_ == std::ios_base::end) {

dwOrigin = STREAM_SEEK_END;

} else {

assert(way_ == std::ios_base::beg);

dwOrigin = STREAM_SEEK_SET;

uliMove.QuadPart = off_;

}

ULARGE_INTEGER uliNewPosition;

if (which_ & std::ios_base::in) {

if (which_ & std::ios_base::out)

return pos_type(off_type(-1));

HRESULT hres = streamIn->Seek(liMove, dwOrigin, &uliNewPosition);

if (hres != S_OK)

return pos_type(off_type(-1));

setg(eback(), egptr(), egptr());

} else if (which_ & std::ios_base::out) {

HRESULT hres = streamOut->Seek(liMove, dwOrigin, &uliNewPosition);

if (hres != S_OK)

return pos_type(off_type(-1));

setp(pbase(), epptr(), epptr());

} else {

return pos_type(off_type(-1));

}

return pos_type(uliNewPosition.QuadPart);

}

COMStreambuf::pos_type COMStreambuf::seekpos(COMStreambuf::pos_type sp_, std::ios_base::openmode which_)

{

return seekoff(off_type(sp_), std::ios_base::beg, which_);

}

在这个列表中,设置streamIn的位置后我调用:

setg(eback(), egptr(), egptr());

在寻求之后,后备或者sungetc将对旧数据进行操作.您可能想要考虑这是否对您的应用程序有意义并做一些不同的事情.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值