istringstrem类中的peek()行为

时间:2015-07-21 12:54:48

标签: c++ eof istringstream 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空字节不一定是“必然”流的末尾?

1 个答案:

答案 0 :(得分:0)

如果你看your std::istringstream constructors,你会看到(2)需要>>> print temp_meas 10+/-1.3 >>> temp_meas.nominal_value = 50 >>> print temp_meas 50+/-2.5 。这可能有嵌入的NUL,但是如果你传递std::string并且那是一个字符数组或buffer,你隐式调用的char*构造函数将使用string - 样式的ASCIIZ长度确定计算出要加载的数据量。您应该明确指定缓冲区大小 - 例如:

strlen

然后你的std::string str(buffer, bytes); std::istringstream is(str); 很健康......有数百名S.O. Q&amp; A关于这个问题;一个随机 - here