C++ ifstream 将读取一些值然后停止

C++ ifstream will read some values then stop

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

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

它将正常工作 12 次迭代,然后开始输出错误的数字。此时它从地址 0x230 转到 0x28B,而它应该位于 0x260。看起来在这个特定的迭代中没有调用 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);
    }
}

您已在文本模式下打开文件。文本模式意味着对文件的操作会将与换行符的平台特定表示相匹配的字节序列解释为单个 '\n' 字符。例如,如果您在 Windows 上,换行符表示为字节序列 0D 0A。因此,在 Windows 上,无论您在文件中做什么,直到您的文件恰好有一个值为 13 的字节后跟一个值为 10 的字节为止。一旦达到这一点,13 后面跟着10 将被解释为单个字符。本质上,文本模式将吞下任何值为 13 的字节,如果它恰好出现在值为 10 的字节之前。您的应用程序将永远不会看到 13,并且超出 13 出现点的任何内容都将以 "shifted" 结束一个字节。在其他平台上,其他换行表示很常见。如果您想使用二进制数据,您通常希望以二进制模式打开文件,例如

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

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