读取二进制文件
二进制文件
要读取二进制文件,首先就需要知道此二进制文件最开始是以什么结构存入的,比如说最开始存入的时候是以char类型存入的,那么一个字节就代表一个数据,而如果是以short类型存入的,那么2个字节代表一个数据。
需要明白此二进制文件的组成结构,才能正确地得到想要的信息。打个比方,我是以一个student类存入的,其结构如下:
class student
{
short num;
short age;
};
读取的时候就按student类型来读取,num占2个字节,age占2个字节。
这种可能过于简单了,那么我来假设二进制文件中的内容是以记录的形式组织的,开始两个字节是本条记录的类型,接着2个字节是本条记录的数据的长度,即后面数据的字节数,其长度不是后面一个数据的字节长度,而是多个数据的字节长度,其数据中不同字段所表达的意义(数据)不同。
是什么数据、此数据是什么意思、此数据有什么意义得看存入时,此二进制文件的创造者赋予它什么意思就是什么意思。
有点类似于加密与解密,要想获取正确得信息,就得明白此信息的加密方式。
于是我建一个类来读取其中的记录:
class Form
{
short form_type;//记录类型
short form_length;//数据的长度(字节长度)
vector<char> arr//用于存放数据,不同字节数据不同
}
需求:我现在想要获取记录类型为1的那条记录中的部分信息,这条记录的数据部分的第7、8个字节表示芳芳的年龄,我现在想要将其取出显示在控制台上。
现在就有一个问题,我在读取是是将数据一个字节一个字节读取到vector内的,而芳芳的年龄是用2个字节来表示的,我该如何获取呢?
很简单,强制转化,直接进入数据的地址出,将char类型读取换成short类型读取即可。
std::ifstream open_file(student.dat, std::ios::binary);
if (!open_file)
{
std::cout << "error" << std::endl;
return 0;
}
std::vector<Form> ret;
while (!open_file.eof())
{
Form temp;
open_file.read((char*)&temp.form_type, sizeof(temp.form_type));
open_file.read((char*)&temp.form_length, sizeof(temp.form_length));
for (int j = 0; j < (temp.form_length); j++)
{
char binary_temp;
inFile.read((char*)&binary_temp, sizeof(binary_temp));
temp.arr.push_back(binary_temp);
}
ret.push_back(record_temp);
}
short age = *((short*)&(ret[0].arr[6]));//第一条信息的地7、8个字节表示年龄
std::cout<<age<<std::endl;
可能你会疑惑我为什么年龄是2个字节,相当于short类型,我为什么不以short类型读入呢,即将Form改为:
class Form
{
short form_type;
short form_length;
vector<short> arr
}
原因很简单,因为有的数据可能需要多个字节表示,以short类型读入就可能会把数据拆散。而char类型只占一个字节,我可以自己组合字节数来输出数据。