【发布时间】:2015-07-21 12:54:48
【问题描述】:
我看到了很多关于 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 知道空字节不是“必然”流的结尾?
【问题讨论】:
-
最大的问题是:你想做什么?
-
你为什么不直接搜索
buffer?索引并不完全是火箭科学。 -
你是对的;但我想探索istringstream类的特性。
标签: c++ eof istringstream peek