将整个二进制文件读入缓冲区,然后以特定格式解析
read the whole binary into a buffer then resolve it in specific format
这是我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
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何以叮当格式设置评论的行长?
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- Vulkan 中的动态顶点缓冲区格式设置