【问题标题】:C++ ifstream will read some values then stopC++ ifstream 将读取一些值然后停止
【发布时间】:2019-05-10 21:41:49
【问题描述】:

我正在尝试编写一个程序,从 bin 文件中读取 940 个 4 字节长的二进制数据 [hex] 值,并将这些值输出到控制台。我在一个循环中有 ifstream::read、cout 和 seekg 操作。

它会在前 10 次左右的迭代中工作,然后在一次迭代中跳过读写操作,执行 seekg 操作,继续读写。最后 200 行左右的值也相同。

它将正常工作 12 次迭代,然后它会开始输出错误的数字。此时它应该在 0x260 时从地址 0x230 到 0x28B。看起来 read 和 cout 在这个特定的迭代中没有被调用。

最后一个正确的值是 3f4fc938。下一个值应该是 3ef646c1。

有谁知道为什么会失败?任何帮助表示赞赏。

这是程序:

int main(int argc, char* argv[]) {
    fstream in;
    uint32_t buffer;
    in.open(argv[1]);
    in.seekg(0x6500,in.beg);
    for(int i = 0; i < 940; i++) {
        in.read(reinterpret_cast<char*> (&buffer),4);
        cout << hex << buffer << endl;
        in.seekg(0x2c,in.cur);
    }
}

【问题讨论】:

  • 每次阅读后in的状态如何?除此之外,没有示例输入文件,任何人都无法帮助您调试此问题。
  • 至少,您应该在每次读取/搜索后检查流状态。不变的价值观?这是根据pre-C++11 on error 的行为。
  • in.fail() 在值停止更改时开始返回 true,但在缺少值的其余循环期间不会。
  • @Kasper 然后你的信息流出了点问题。也许是一个超出文件长度的地址?如果您不清除失败位,那么您将不再阅读任何有意义的内容。不过,我怀疑仅清除失败位是一个好主意,尤其是在文件上。可能停止并拒绝整个文件无效是更好的方法。
  • 在不知道您的确切文件格式和预期解释的情况下,真的不可能提供帮助。我已经在 gutenberg.org/files/58444/58444-0.txt 的已保存副本上运行了您的代码,它迭代 939 次并每次迭代输出一行,因此代码似乎可以像宣传的那样用于随机输入。

标签: c++ binary hex fstream


【解决方案1】:

您已以文本模式打开文件。文本模式意味着对文件的操作会将与平台特定的换行符表示匹配的字节序列解释为单个'\n' 字符。例如,如果您使用的是 Windows,则换行符表示为字节序列 0D 0A。因此,在 Windows 上,您在文件中所做的任何事情都可以正常工作,直到您的文件恰好有一个值为 13 的字节后跟一个值为 10 的字节。一旦达到该点,将解释 13 后跟 10作为单个字符。本质上,文本模式只会吞下任何值为 13 的字节,如果它恰好出现在值为 10 的字节之前。您的应用程序将永远不会看到 13,并且超出 13 出现点的任何内容最终都会“移动”一个字节.在其他平台上,其他换行表示很常见。如果你想使用二进制数据,你通常会希望以二进制模式打开文件,例如

fstream in(argv[1], std::ios::binary);

in.open(argv[1], std::ios::binary);

【讨论】:

  • 我改了一行:in.open(argv[1], fstream::in | fstream::binary);现在一切正常。谢谢各位
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2016-04-03
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多