【发布时间】: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 次并每次迭代输出一行,因此代码似乎可以像宣传的那样用于随机输入。