将整个二进制文件读入缓冲区,然后以特定格式解析

read the whole binary into a buffer then resolve it in specific format

本文关键字:定格 格式 然后 二进制文件 缓冲区      更新时间:2023-10-16

这是我C++作业。给定一个二进制文件,此文件由一些数据单元组成。每个数据单元都包含两个部分。第一部分是 1char,第二部分是 1int.一次将整个文件读入缓冲区,然后从缓冲区中提取所有数据单元。 现在我已经成功地将文件读入缓冲区,如下所示:

char* readBinaryFile(const char* fileName) {
ifstream file(fileName, ios::binary || ios::ate);
// get the size of file
streampos beg, end;
beg = file.tellg();
file.seekg(0,ios::end);
end = file.tellg();
long size = end - beg;
char* buffer = new char[size];
// now read the file into buffer
file.seekg(0, ios::beg);
file.read(buffer, size);
file.close();
return buffer;
}

所以我的问题是如何从缓冲区获取数据单元?

我不打算为你编写代码,但请考虑一下......

buffer[0]是你的第一个字符。从buffer[1]buffer[4]是你的第一个int。它重复,因此第二组数据的字符buffer[5]

字符和 int 一起有五个字节。如果你知道你读取的数据量,你可以把它除以5,知道有"集"的数据的数量。

现在,您可以使用类似for循环的东西从零迭代到集合数减去 1。假设这个迭代器变量是i,那么你可以用buffer[i * 5]、int atbuffer[i * 5 + 1]的第一个字节等来访问每个"集合"数据的字符。

因此,for 循环和一点数学将帮助您从该缓冲区中提取信息。您将有 5 个单独的字节,您需要将其中的 4 个字节重新组合成一个 int。有多种方法可以实现这一点,我将让您尝试发现。

您的问题是否源于您正在使用的事实:

ios::binary || ios::ate

当我认为你的意思是:

ios::binary | ios::ate

前者的计算结果为"1",因为二进制逻辑或结尾是"true",后者是一个位掩码,上面写着"以二进制模式打开此文件,最后"。你写它的方式实际上相当于

ios::app