【问题标题】:Reading in one byte at a time with .get() [duplicate]使用 .get() 一次读取一个字节 [重复]
【发布时间】:2016-05-25 00:05:06
【问题描述】:

所以我正在读取包含以下内容的输入文件:

lololololololol

我需要一次使用二进制一个字节来读取它,以便稍后做一些事情。为此,我使用get() 读取它,然后将其存储到一个字符中。除了它读入的最后一个字符外,它似乎工作正常。它正在读入的向量包含:

lololololololol
�

我不太确定最后一个值是什么,但它完全抛弃了我的最终输出。所以我的问题是,get() 是否有理由从我的文本文档中读取不存在的值或字节?还是在阅读我不知道的内容?

代码:

while(istr.good()) {
    temp = istr.get();
    input.push_back(temp);
}

【问题讨论】:

  • get 在到达文件末尾时返回EOFgood 在此之前不会报告文件结束。所以神秘的字符就是EOF标记。
  • @JonathanPotter 请不要在 cmets 中回答。
  • 为什么while (stream is good) { read from stream; use data } 是错误的教科书示例。直到 您尝试读取缓冲区末尾之后,该流才会变得不好。 .good() 不告诉未来。

标签: c++ file vector while-loop istream


【解决方案1】:

它正在读取EOF (end of file) 字符。您需要阅读后进行检查以避免将其插入向量中:

while(temp = istr.get(), istr.good()) // comma operator
    input.push_back(temp);

或者您可以使用第二个std::istream_base::get overload 并让istr 隐式转换为bool

while(istr.get(temp))
    input.push_back(temp);

或者试试more advanced approachesoperator>>std::getline 也适用于这种输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多