关闭

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

标签: 变长数据 文件 读写数据结构
95人阅读 评论(0) 收藏 举报
分类:

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

比如下面的数据结构,由于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; 





1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3263次
    • 积分:193
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条