peek() istringstrem 类中的行为
peek() behavior in istringstrem class
本文关键字:istringstrem peek 更新时间:2023-10-16
我在窥视方法上看到了很多问题,但我关注的是一个几乎显而易见的主题,但仍然(我认为(很有趣。
假设您有一个要读取的二进制文件,并且您选择在程序内存中将其作为一个整体启动,并使用 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
空字节"不一定"是流的末尾?
如果你看一下你的std::istringstream
构造函数,你会发现(2(需要std::string
。 这可以有嵌入式 NULL,但是如果您传递buffer
并且它是一个字符数组或char*
,则隐式调用的string
构造函数将使用strlen
样式的 ASCIIZ 长度确定来确定要加载的数据量。 相反,您应该显式指定缓冲区大小 - 如下所示:
std::string str(buffer, bytes);
std::istringstream is(str);
那么你的while(!is.eof()
是笨拙的...关于这个问题有数百个 SO 问答;一个随机 - 这里。
相关文章:
- 使用std::istream::peek()总是安全的吗
- cin.peek() 在 c++ 中是如何工作的
- 当 stream.peek()=='' 时,流>> z1 有什么用
- 文件设置正确,但eof()和peek()意外地从新流返回了错误的值
- c++读取txt文件并复制到两个类istream::peek()中
- CIN.PEEK用于输入验证
- 如何正确使用cin.peek()
- c cin.get(),cin.peek()暂停,与stdio相同
- 在使用喜欢的列表中,在堆栈中实现适当的(受底流的)POP/PEEK方法的麻烦
- C++: cin.peek(), cin >> char, cin.get(char)
- C++和 Java 数据结构的重叠:堆栈"top"与"peek"
- 使用 cin.peek() 和使用 cin.peek() 检测输入结束时出现问题
- 类似函数peek();(来自C++)
- C++无法在堆栈中使用peek()函数
- 文件处理:peek()函数在c++中有什么用途
- 栈实现了Queue Peek功能
- Get()和peek()有助于存储大数
- 在重载输入流时使用peek()
- c++ peek()看不到新行字符
- peek() istringstrem 类中的行为