首页 文章

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

提问于
浏览
0

我正在尝试编写一个程序,从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);
    }
}

1 回答

  • 2

    您已在文本模式下打开文件 . 文本模式意味着对文件的操作将解释与新行的特定于平台的表示形式匹配的字节序列作为单个 '\n' 字符 . 例如,如果您在Windows上,则换行符表示为字节序列 0D 0A . 所以在Windows上,无论你在文件中做什么,都会很好地工作到你的文件碰巧有一个值为13的Byte,然后是一个值为10的Byte . 一旦你到达那个点,那么13将跟随10作为一个单一的角色 . 本质上,如果文本模式恰好出现在值为10的字节之前,则文本模式将只吞下任何字节值13 . 您的应用程序将永远不会看到13和超出13出现的点的任何内容将以一个字节结束"shifted" . 在其他平台上,其他换行表示很常见 . 如果您想使用二进制数据,通常需要以二进制模式打开文件

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

    要么

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

相关问题