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

原创 2016年08月28日 18:13:45

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

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





数据结构的变长字段设计

通常有这样两种方式struct ***{    .......    ......    size_t data_size;    char pdata[0];};最后一个字段为变长字段。有一个好处最...
  • pennyliang
  • pennyliang
  • 2007年02月25日 10:23
  • 1507

0元素数组实现变长TLV数据结构

0元素数组实现变长TLV数据结构2009-09-20 15:15最近看的代码里用的比较多的就是使用0元素数据来实现变长的TLV数据结构,这种实现方法巧妙,使用方便,但注意老版本C不支持这种定义,C99...
  • Grong_H
  • Grong_H
  • 2009年12月05日 10:41
  • 1602

变长数据结构

struct dirent{..............char a[1];}在这里char a[1];长度为1,一般认为作为字符数组只能存放/0,但在这里a[1]声明是放在结构体的最后,属于变长数据...
  • dadalan
  • dadalan
  • 2009年08月28日 21:50
  • 1554

【C语言】变长数组与柔性数组

前两天看程序,发现在某个函数中有下面这段程序:int n; //define a variable n int array[n]; //define an arr...
  • Always__
  • Always__
  • 2016年05月11日 17:34
  • 2616

变长子网掩码划分流程

> 现要将一C类网段地址192.168.18.0/24分成三个子网(主机数为80,50,24)及10台公用办公设备(第四个子网)。 若按固定子网掩码的方式来划分该C类IP地址,要将该IP划分成4个...
  • hzhvv
  • hzhvv
  • 2016年06月22日 15:53
  • 3416

什么是 VLSM(可变长子网掩码)

VLSM规定了如何在一个进行了子网划分的网络中的不同部分使用不同的子网掩码 所以谈到...
  • u014369321
  • u014369321
  • 2014年04月13日 20:15
  • 535

VLSM(可变长子网掩码)

vlsm 百科名片    vlsm子网设计 VLSM(可变长子网掩码) 是为了有效的使用无类别域间路由(CIDR)和路由汇总来控制路由表的大小,网络管理...
  • Linux_Rice
  • Linux_Rice
  • 2011年10月17日 11:14
  • 6008

可变长数组

最近项目中需要目录遍历,把遍历到的文件/文件夹保存到数据结构中,其他模块根据索引找对对应的文件名和路径 实现如下: 1 2 3 4 5 6 7 8 9 10...
  • anyliwu
  • anyliwu
  • 2016年09月30日 16:10
  • 140

变长数组-C99新特性

C99允许我们在任何地方定义变量,并且支持不定长数组的定义,即,我们可以使用变量来定义我们的数组。这就使得我们可以在程序运行过程中根据实际需要来定义数组长度。 摘自http://hi.baidu.co...
  • IT_PCode
  • IT_PCode
  • 2013年12月11日 11:51
  • 1839

变长结构体的应用

顾名思义,结构体长度是“可变”的。但是这个可变不针对sizeof()函数。 用例代码: //弹性数组的大小,各对象是否都不一样? //如果都一样,怎么看空间大小,用sizeof array来加? ...
  • huqinweI987
  • huqinweI987
  • 2016年02月29日 22:30
  • 1628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:可变长数据结构的文件读写
举报原因:
原因补充:

(最多只允许输入30个字)