我看到了很多关于 peek 方法的问题,但我的话题几乎是显而易见的,但(我认为)很有趣。
假设您有一个二进制文件要读取,并且您选择在程序内存中将其作为一个整体调出并使用 istringstream 对象来执行读取。
例如,如果您正在搜索流中给定字节的位置,重复访问硬盘会浪费时间和资源......
但是,一旦您创建了 istringstream 对象,任何最终的 NULL 字节都会被视为 EOF 信号。
至少这是在以下短代码中发生在我身上的事情:
// obvious omissis
std::istringstream is(buffer);
// where buffer is declared as char *
// and filled up with the contents of
// a binary file
char sample = 'a';
while(!is.eof() && is.peek() != sample)
{ is.get(); }
std::cout << "found " << sample << " at " << is.tellg() << std::endl;
此代码不适用于 g++ 4.9 和 clang 3.5,假设在可以找到buffer
匹配之前内部有一个空字节,因为该空字节设置了该位。sample
eof
所以我的问题是:这种方法是完全要避免的,还是有某种方法可以教导peek
空字节不是“必然”流的结尾?