我看到很多关于偷看方法的问题,但是我的问题涉及一个几乎显而易见但仍然(我认为)有趣的话题。
假设您有一个要读取的二进制文件,并且您选择将它作为一个整体在程序存储器中显示并使用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
空字节不一定是“必然”流的末尾?
答案 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。