0

我看到了很多关于 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匹配之前内部有一个空字节,因为该空字节设置了该位。sampleeof

所以我的问题是:这种方法是完全要避免的,还是有某种方法可以教导peek空字节不是“必然”流的结尾?

4

1 回答 1

0

如果您查看您的std::istringstreamconstructors,您会看到 (2) 需要一个std::string. 这可以嵌入 NUL,但是如果您传递buffer并且这是一个字符数组 or char*,那么string您隐式调用的构造函数将使用strlen-style ASCIIZ 长度确定来计算要加载多少数据。相反,您应该明确指定缓冲区大小 - 例如:

std::string str(buffer, bytes);
std::istringstream is(str);

那么你while(!is.eof()是笨拙的......关于这个问题有数百个SO Q&A;一个随机的-在这里

于 2015-07-21T13:02:52.633 回答