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

原创 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
  • 下载

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

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

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

小弟不才,自己整理了几种高效的读写大文件的方法,有兴趣的可以看看`package com.nio; import java.io.BufferedReader; import java.io.Bu...

IOS iPhone 开发中的文件读写及数据存储(一)

数据的存储无疑是软件开发中的重要课题。本文给初学者介绍下iphone开发中常见的文件读写,当然,我也是初学者~ iOS的文件存储采用的是“沙箱机制”,也就是应用程序只能访问自己的文件目录,每个应用程...
  • wxq888
  • wxq888
  • 2012-11-16 16:08
  • 23605

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

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

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

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

PHP文件读写以及本地跑数据一些坑

文件读写这段时间在做PHP相关的开发,经常会做PHP下的文件读写,主要用于跑数据需求。大家平常在工作的过程中,经常会涉及到一些数据需求,这些数据常常无法通过一条sql语句完成,或者sql的查询效率会很...

R语言数据文件读写

转载自:http://www.cnblogs.com/emanlee/archive/2012/12/04/2802352.html R语言数据储存与读取 1 首先用getwd() 获得当前目...

Android下的数据保存、文件读写以及访问模式

如何在手机上保存数据: 1. android的文件系统使用的是linux的文件系统(没有c盘 d盘..) 2. android下应用程序的路径和javase不同,直接保存在根目录下会报错.这是因为...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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