可变长数据结构的文件读写

可变长数据结构,也是比较实用的,尤其在内存需要节俭的时候。

比如下面的数据结构,由于string长度是不确定的

typedef struct SMagicDat
{
	int         id; 
	std::string str1; 
	std::string str2; 
}SMagicDat;
像这样的变长数据写入文件后,回读就比较麻烦。


本次操作实例一枚,仅作参考

int main()
{
	fstream fout("bb.txt", ios::binary|ios::out); 
	if (fout == 0)
		return -1; 
	int iCnt = 0; 
	fout.write((char*)&iCnt, sizeof(iCnt)); 
	fout.close(); 

	typedef struct SVarlength
	{
		int id; 
		int id2;
		int len; 
	}SVarlength;
	
	typedef struct SMagicDat
	{
		int         id; 
		std::string str1; 
		std::string str2; 
	}SMagicDat;

	fstream fout2("bb.txt", ios::binary|ios::in|ios::out); 
	if (fout2 == 0)
		return -1; 
	int iCnt2 = 0; 
	fout2.read((char*)&iCnt2, sizeof(iCnt2)); 
	printf("icnt2=%d.\n", iCnt2); 
	
	SDat src_dat[10];
	char szTemp[100] = {0}; 
	string strVar; 
	SVarlength var; 
	char chSTX = 0x02; 
	char chETX = 0x03; 
	fout2.seekp(sizeof(iCnt2), ios::beg); 
	for(int ii=0; ii<10; ii++)
	{
		src_dat[ii].id = 100+ii; 
		sprintf(szTemp, "id=%d,str1=%d.", src_dat[ii].id, src_dat[ii].id); 
		src_dat[ii].str1 = szTemp; 
		sprintf(szTemp, "id=%d,str2=%d.%d=str2", src_dat[ii].id, src_dat[ii].id, src_dat[ii].id);
		src_dat[ii].str2 = szTemp; 

		strVar = chSTX + src_dat[ii].str1 + chETX \
			+ chSTX + src_dat[ii].str2 + chETX; 

		var.id = src_dat[ii].id; 
		var.id2 = src_dat[ii].id + 100; 
		var.len = strVar.length(); 

		fout2.write((char*)&var, sizeof(var)); 
		fout2.write(strVar.c_str(), strVar.length()); 
	}
	// 
	iCnt2 += 10; 
	fout2.seekp(0, ios::beg); 
	fout2.write((char*)&iCnt2, sizeof(iCnt2)); 
	fout2.close(); 

	fstream fin("bb.txt", ios::binary|ios::in); 
	if (fin == 0)
		return -1; 
	int iCnt3 = 0; 
	fin.read((char*)&iCnt3, sizeof(iCnt3)); 
	printf("icnt3=%d.\n", iCnt3); 

	SVarlength var2; 
	char* pBuff = NULL; 
	int iBuff = 0; 
	for(int ii=0; ii<iCnt3; ii++)
	{
		fin.read((char*)&var2, sizeof(var2)); 
		printf("id=%d, id2=%d, len=%d: ", var2.id, var2.id2, var2.len); 
		if (var2.len > iBuff)
		{
			if (iBuff > 0)
			{
				delete[] pBuff; 
			}
			pBuff = new char[var2.len + 2];
			if (pBuff)
			{
				iBuff = var2.len + 2;
			}
		}
		fin.read(pBuff, var2.len); 
		printf("%s.\n", pBuff); 
	}
	if (iBuff > 0)
	{
		iBuff = 0; 
		delete[] pBuff; 
	}

	return 0; 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值