c++读取二进制文件

读取二进制文件


二进制文件

要读取二进制文件,首先就需要知道此二进制文件最开始是以什么结构存入的,比如说最开始存入的时候是以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类型只占一个字节,我可以自己组合字节数来输出数据。

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值