[英]read the whole binary into a buffer then resolve it in specific format
这是我的C ++作业。 给定一个二进制文件,该文件包含一些数据单元。 每个数据单元包含两个部分。 第一部分为1 char
,第二部分为1 int
。 一次将整个文件读入缓冲区,然后从缓冲区中提取所有数据单元。 现在,我已成功将文件读入缓冲区,如下所示:
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]
是您的第一个整数。 它会重复,因此buffer[5]
是第二组数据的字符。
字符和int总共有五个字节。 如果您知道所读取的数据量,则可以将其除以5,然后知道其中有“数据集”的数量。
现在,您可以使用诸如for
循环之类的for
从零迭代到集数减一。 假设这个迭代器变量是i
,那么您可以使用buffer[i * 5]
,int在buffer[i * 5 + 1]
处的第一个字节等访问数据的每个“集合”的字符。
因此,一个for循环和一些数学运算将帮助您从该缓冲区中提取信息。 您将拥有5个单独的字节,并且需要将其中的4个字节重组为一个int。 有多种方法可以实现此目的,我将让您尝试发现。
您的问题可能源于您正在使用的事实:
ios::binary || ios::ate
当我认为你的意思是:
ios::binary | ios::ate
前者的计算结果为“ 1”,因为二进制逻辑或末尾为“ true”,而后者则是一个位掩码,表示“以二进制模式并在末尾打开此文件”。 您编写的方式实际上等同于
ios::app
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.