gpt4 book ai didi

C++ 二进制文件读入结构

转载 作者:行者123 更新时间:2023-11-27 23:27:28 25 4
gpt4 key购买 nike

我使用如下结构编写了一个二进制文件:

struct block{
char data[32];
};

所以我最终得到的基本上是一个充满 char[32] 的大型二进制文件。数据在特定位置格式化,因此抓取特定信息并不困难。但是,我尝试像这样读取文件:

int lines=0;
std::ifstream inputFile("file.bin",std::ios::binary);

while (!inputFile.eof())
{
inputFile.read(blocks[lines].data, sizeof(block));
lines++;
}

inputFile.close();
lines--;

然后像这样显示:

std::cout<<"block 1: "<<blocks[0].data<<std::endl;
// etc ...

我认为 blocks[i].data 应该只给我属于索引 i 的 char[32],但它却给了我结构中从该索引到结构末尾的每个“数据”元素。我确定这是我对它的工作原理的误解。我的问题是:如何才能得到由 blocks[i].data 表示的 char[32]?

最佳答案

问题是你的std::cout输出语句。当您尝试输出 blocks[0].data , 什么 operator<< gets 不是 32 个字符的数组,而是指向第一个字符的指针。这被解释为指向 C 字符串的指针,因此它输出从内存中找到的所有字符,直到找到 '\0'。 .由于每个数组元素仅包含文件中的相应字符,因此输出文件的所有字符(除非文件中有 '\0',否则输出会在此处停止)。此外,您似乎(不)幸运 '\0'跟随内存中的数据,因此输出会在那里停止(而不是继续输出内存中的任何内容,并且可能在到达进程内存末尾时给出段错误)。

要仅将 32 个字符输出为字符,请使用 std::cout.write(blocks[0].data,32) .否则将它们输出为 int 只是循环遍历它们并将每个转换为 int:

for (int i = 0; i < 32; ++i)
std::cout << static_cast<int>(blocks[0].data[i]) << ' ';

当然,您可以使用所有流操纵器来获取所需形式的数字(例如 std::hex 用于十六进制输出,和/或 std::setwstd::setfill 以获得固定宽度的数字)。

关于C++ 二进制文件读入结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8349555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com