【问题标题】:peek() behavior in istringstrem classistringstrem 类中的 peek() 行为
【发布时间】: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


【解决方案1】:

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

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

那么你的while(!is.eof() 很笨重……有数百个 S.O.关于该问题的问答;随机一个 - here。

【讨论】:

  • 感谢您的回答;关于while 表达式中的!is.eof(),我知道它“不合适”。我只是把它留在那里,因为我想确保 peek() 负责设置 eof 位...
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多