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

原创 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; 





文件读写数据转换

  • 2015年01月27日 21:30
  • 1.35MB
  • 下载

IDE & 软件结构 & 下拉菜单带图片 & 调用shell脚本 & 读取JTree文件名 & 文件读写 & File&ImageUtil & 行号 & 高亮 & 字体 & 背景颜色

IDE (布局好看) 编译原理课程设计作业,源码在网盘里,就不往外放了 这里显示关键源码 背景颜色 pane.setFont(new Font(“YaHei Consol...

结构体数组操作+文件读写

一.1.声明了该结构体就声明了结构体内所有成员。 #include typedef struct stuInfo { char *name; int age; ...

【MFC】:MFC关于文件读写的代码及结构体的错误问题

首先,这篇文章要给大家讲一句关于VC里面结构体的声明问题 比如说下面的代码: struct pos{ CString temp’ }P[5000]; ...

在 iOS 中对接收到的网络数据(NSData)进行文件读写

在 c 语言中,文件操作都是由库函数来实现的,主要是分为读和写两种操作: 文件指针 平常所说的文件不同于其他常见的数据类型,比如一个test.txt文档,它有自己的一些属性,比如文件的当前位置、与该文...

python 从文件读写,mysql批量插入数据

python 从文件读写,mysql批量插入数据

【转】Matlab的各种数据读取、文件读写等操作汇总

MATLAB提供了多种方式从磁盘读入文件或将数据输入到工作空间,即读取数据,又叫导入数据;将工作空间的变量存储到磁盘文件中称为存写数据,又叫导出数据。至于选择哪种机制,则根据下面两个因素决定: ● ...

R语言 | 数据文件读写

原文地址:http://www.cnblogs.com/emanlee/archive/2012/12/04/2802352.html R语言数据储存与读取 1 首先用ge...

大数据量的文件读写 java nio的完全发挥

小弟不才,自己整理了几种高效的读写大文件的方法,有兴趣的可以看看`package com.nio; import java.io.BufferedReader; import java.io.Bu...
  • xinda77
  • xinda77
  • 2016年12月21日 11:55
  • 1109
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:可变长数据结构的文件读写
举报原因:
原因补充:

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