c++保存 vector 到文件

c++ 保存 vector 到文件

实现将vector中的数据保存到二进制文件和从文件中读取数据并还原vector并不难,关键是要把握好一些小细节背后的原理,以及确定好存储的格式。确定格式跟网络通信中的通信协议非常相似,只用存取双方都依照协议行事,才能完成完整步骤。以下代码提供例子,仅供参考:

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
#include<string.h>
#include<fstream>
using namespace std;

const int vertif = 0x1234abcd;		//vertif放在文件的开头和结尾用于简单判断是否正确读取数据 
string filePath = "D:/TEMP/DATA";		

struct Unit{
	int idx;
	char str[10];
};


//将vector保存到二进制文件 
int saveData(){
	//创建测试数据 
	Unit tmp;
	vector<Unit>Data;	
	tmp.str[0] = 'a';
	for(int i=0; i<10; i++){
		tmp.idx = i;
		tmp.str[0] ++;
		Data.push_back(tmp); 	//注意若存放的是指针类型则需要动态申请内存再pushback() 
	}
	//将vector保存到文件,格式:4字节检验码+4字节数组长度+4字节数据长度+可变长度的数据+4字节尾部检验码
	ofstream ofile(filePath.c_str(), ios::binary);
	if(ofile.is_open()==false){
		cout<<"Open file fail!"<<endl;
		exit(1);
	}
	ofile.write((char*)&vertif, sizeof(int));
	
	int length = Data.size();
	ofile.write((char*)&length, sizeof(int)); 
	
	int totalSize = Data.size()*sizeof(Unit);
	ofile.write((char*)&totalSize, sizeof(int));
	
	ofile.write((char*)&Data[0], totalSize);	//注意取址方式,不能用begin() 
	ofile.write((char*)&vertif, sizeof(int));
	
	ofile.close();
	return 0;
} 

//从二进制中读取之前保存的数据并还原vector
int restore(){
	ifstream ifile(filePath.c_str(), ios::binary);
	int tmpVertif, length, totalSize;
	ifile.read((char*)&tmpVertif, sizeof(int));
	if (tmpVertif!=vertif){
		cout<<"Unknow format at the begin of file...";
		exit(1);
	}
	ifile.read((char*)&length, sizeof(int));
	ifile.read((char*)&totalSize, sizeof(int));
	vector<Unit>Data(length);	//需要往文件里面放长度的原因
	ifile.read((char*)&Data[0], totalSize);
	ifile.read((char*)&tmpVertif, sizeof(int));
	if (tmpVertif!=vertif){
		cout<<"Unknow format at the end of file..."<<endl;
		exit(1);
	}
	for(int i=0; i<Data.size(); i++){
		cout<< Data[i].idx <<"   "<<Data[i].str[0] <<endl;
	} 
	return 0;
} 

int main(){
	saveData();
	restore();
}

运行的结果:
在这里插入图片描述

发布了90 篇原创文章 · 获赞 31 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/BlackCarDriver/article/details/103690469