亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mydbf.cpp

?? DBF文件解析讀取 普通字段類型解析 其他
?? CPP
字號:


#include "stdafx.h"
#include "MyDBF.h"


#include <iostream>



CMyDBF::CMyDBF()
{

}

CMyDBF::~CMyDBF()
{

}

void CMyDBF::SetDBFFile(std::string &FilePath)
{
	m_strDBFFile = FilePath;
}

// 設(shè)置 內(nèi)存池大小 及 增減值
// 數(shù)據(jù)讀取完成之后 可用空間 小于 StepNum 申請 StepNum 空間
//					可用空間 大于 StepNum 釋放 (StepNum / 2)空間
void CMyDBF::SetPoolParms(int InitNum, int StepNum)
{
	m_szPoolInitNum = InitNum;
	m_szPoolStepNum = StepNum;
}

// 讀取 dbf 頭部 字段參數(shù)
// 內(nèi)存池 申請 足夠的空間
bool CMyDBF::Init()
{
	std::fstream fs;
	fs.open(m_strDBFFile.c_str(),std::ios::in | std::ios::binary);

	if (! fs.good())
		return false;

	// 讀取頭部 
	// 讀取前面 32 字節(jié)
	unsigned char Data[36];
	unsigned char c;
	
	fs.seekg(0);
	
	int i = 0;
	memset(Data,0,sizeof(Data));
	while(i < 32)
	{
		c = fs.get();	

		if (fs.eof())
		{
			fs.close();
			
			return false;
		}
		
		Data[i++] = c;
	}
	
	long * pRecordNum = (long*)(Data + 4);
	m_szHeader.RecordsNum = *pRecordNum;
	
	short * pHeaderSize = (short *)(Data + 8);
	m_szHeader.HeaderSize = *pHeaderSize;
	
	short * pRecordSize = (short *)(Data + 10);
	m_szHeader.RecordSize = *pRecordSize;
	
	
	//字段數(shù)據(jù)
	m_szFieldsVec.clear();

	// 最后一個字符 0x0D 不讀取
	int Size = m_szHeader.HeaderSize - 32 - 1;
	
	// 最多 100 字段  100 * 32 字節(jié) = 3200
	char Buff[1024*4];
	memset(Buff,0,sizeof(Buff));
	
	fs.seekg(32);
	
	i = 0;
	
	while(i < Size)
	{
		c = fs.get();
		
		if (fs.eof())
		{
			fs.close();
			
			return false;
		}
		
		Buff[i] = c;
		
		i++;
	}

	// 關(guān)閉文件
	fs.close();
	
	// 所有的頭部分?jǐn)?shù)據(jù)讀完
	i = 0;
	int Offsize = 1;
	
	while(i < Size)
	{
		// 分析字段
		memset(Data,0,sizeof(Data));
		
		int j = 0;
		while(j < 32)
		{
			Data[j++] = Buff[i++];//*((unsigned char*)pData + (i++));
		}
		
		_FIELD szField;
		memset(&szField,0,sizeof(_FIELD));
		
		strcpy(szField.Name,(char*)Data);
		_strupr(szField.Name);
		
		long *pOffsize = (long*)(Data + 12);
		
		if (*pOffsize == 0)
			szField.RecordOffsize = Offsize;
		else
			szField.RecordOffsize = *pOffsize;
		
		szField.Len = (short)Data[16];
		
		Offsize += szField.Len;
		
		m_szFieldsVec.push_back(szField);
	}
	
	// 內(nèi)存池
	m_szFreeVec.clear();

	for(i = 0; i < m_szPoolInitNum; i++)
	{
		void *pRecord = malloc(m_szHeader.RecordSize);

		if (pRecord == NULL)
		{
			// 內(nèi)存不足 直接返回
			return false;
		}

		m_szFreeVec.push_back(pRecord);
	}

	return true;
}

// 釋放內(nèi)存池
void CMyDBF::Uninit()
{
	int i;
	
	// 釋放已經(jīng)使用的空間
	for(i = 0; i < m_szRecordVec.size(); i++)
	{
		void *pRecord = m_szRecordVec.at(i);
		
		free(pRecord);
		
		m_szRecordVec.at(i) = NULL;
	}
	
	// 釋放未被使用的空間
	for(i = 0; i < m_szFreeVec.size(); i++)
	{
		void *pRecord = m_szFreeVec.at(i);
		
		free(pRecord);

		m_szFreeVec.at(i) = NULL;
	}
}

// 讀取記錄集數(shù)據(jù)
bool CMyDBF::ReadRecordsets()
{
	// 讀取文件大小 
	std::fstream fs;
	fs.open(m_strDBFFile.c_str(),std::ios::in | std::ios::binary);

	if (! fs.good())
		return false;

	unsigned char c;
	int i;
	
	fs.seekg(m_szHeader.HeaderSize);
	
	bool bInvalid = false;
	
	// 讀取所有記錄
	while(! fs.eof())
	{
		void *pRecord = NULL;

		if (! GetPoolSpaceItem(&pRecord))
			break;
		
		i = 0;
		
		while(i < m_szHeader.RecordSize)
		{
			c = fs.get();
			
			if (fs.eof())
			{
				bInvalid = true;
				break;
			}

			*((unsigned char*)pRecord + i) = c;
			
			i++;
		}
		
		if (! bInvalid)
		{
			m_szRecordVec.push_back(pRecord);
		}
		else
		{
			// 放回去
			m_szFreeVec.push_back(pRecord);

			break;
		}
	}

	fs.close();

	// 查看是否釋放空間
	if(m_szFreeVec.size() > m_szPoolStepNum)
	{
		int FreeNum = m_szFreeVec.size() - m_szPoolStepNum;

		for(i = 0; i < FreeNum; i++)
		{
			void *pRecord = m_szFreeVec.at(m_szFreeVec.size() - 1);
			
			m_szFreeVec.erase(m_szFreeVec.end() - 1);

			free(pRecord);
		}
	}
	
	return true;
}

// 釋放記錄集數(shù)據(jù)
void CMyDBF::ReleaseRecordsets()
{
	int i;
	
	// 將使用過的空間 放入未用列表
	for(i = 0; i < m_szRecordVec.size(); i++)
	{
		void *pRecord = m_szRecordVec.at(i);
		
		if (pRecord != NULL)
			m_szFreeVec.push_back(pRecord);
				
		m_szRecordVec.at(i) = NULL;
	}

	m_szRecordVec.clear();
}

bool CMyDBF::GetPoolSpaceItem(void **pSpaceItem)
{
	if (m_szFreeVec.empty())
		return false;

	*pSpaceItem = m_szFreeVec.at(m_szFreeVec.size() - 1);

	m_szFreeVec.erase(m_szFreeVec.end() - 1);

	// 查看是否要增加空間
	if (m_szFreeVec.size() < m_szPoolStepNum)
	{
		for(int i = 0; i < m_szPoolStepNum; i++)
		{
			void *pRecord = malloc(m_szHeader.RecordSize);
			
			if (pRecord == NULL)
			{
				// 內(nèi)存不足 
				break;
			}
			
			m_szFreeVec.push_back(pRecord);
		}
	}

	return true;
}





// 獲取某條記錄某個字段的值
bool CMyDBF::GetFieldValue(void* pRecord, char *pFieldName, char* pData)
{
	char Data[64];

	memset(Data,0,sizeof(Data));
	strcpy(Data,pFieldName);

	_strupr(Data);

	std::string strName = Data;

	int FieldIndex = -1;

	for(int i = 0; i < m_szFieldsVec.size(); i++)
	{
		if (strName == m_szFieldsVec.at(i).Name)
		{
			FieldIndex = i;
			break;
		}
	}

	if (FieldIndex < 0)
		return false;

	memcpy(pData,((unsigned char*)pRecord + m_szFieldsVec.at(FieldIndex).RecordOffsize),
		m_szFieldsVec.at(FieldIndex).Len);

	return true;
}


void CMyDBF::GetDataChar(char* pData, std::string &strData)
{
	char Data[512];
	
	memset(Data,0,sizeof(Data));
	strcpy(Data,pData);

	strData = Data;

	BWSMGFun::TrimString(strData);
}

void CMyDBF::GetDataInteger(char* pData, long &szData)
{
	szData = *(long*)pData;
}

void CMyDBF::GetDataNumber(char* pData, double &dbData)
{
	char Data[64];
	
	memset(Data,0,sizeof(Data));
	strcpy(Data,pData);
	
	dbData = atof(Data);
}

// theTm 只存儲數(shù)據(jù) 不做 tm 格式處理
void CMyDBF::GetDataDate(char* pData, tm &theTm)
{
	// 20070702
	char Data[64];
	
	memset(Data,0,sizeof(Data));
	memcpy(Data,pData,8);

	memset(&theTm,0,sizeof(tm));

	std::string strData = Data;

	theTm.tm_year = atol(strData.substr(0,4).c_str());
	theTm.tm_mon = atol(strData.substr(4,2).c_str());
	theTm.tm_mday = atol(strData.substr(6,2).c_str());
}

void CMyDBF::GetDataDatetime(char* pData, tm &theTm)
{
	char Data[64];
	
	memset(Data,0,sizeof(Data));
	memcpy(Data,pData,8);
	
	memset(&theTm,0,sizeof(tm));
	
	long DayNum = *(long*)Data;
	long MillionSeconds = *(long*)(Data + 4);

	/*
	The datevalue is stored as a day number since -4831 (or something like 
	that). A real date like 1 jan 1900 is daynumber 0x24d9ad and therefore 
	stored as ad d9 24 00 
	
	  Time is stored in number of milliseconds since 12 o'clock so 23.59.59 
	  will be 0x05265818 and therefore stored as 18 58 26 05 
	  Sometimes the entered time from the user will be slightly different 
	  from was is stored. e.g. the user enters 0:0:1 and it is stored as 999 
	  msec instead of 1000. So be sure to round the values instead of 
	  trunicating. 
	*/
	
	// 0001-01-01 0x001a4452
	// 
	theTm.tm_year = 1;
	theTm.tm_mon = 1;
	theTm.tm_mday = 1;
	theTm.tm_hour = 0;
	theTm.tm_min = 0;
	theTm.tm_sec = 0;
	
	int AddDays = DayNum - 0x001a4452;
	
	if (AddDays < 0)
		return ;
	
	int TheYear = 1;
	int TheMonth = 1;
	
	while(AddDays > 0)
	{
		int Day1 = BWSMGFun::GetDaysOfYears(TheYear);
		
		if (AddDays >= Day1)
		{
			// 增加 1 年
			theTm.tm_year += 1;
			
			TheYear ++;
			
			AddDays -= Day1;
		}
		else
		{
			// 增加一個月
			int Day1 = BWSMGFun::GetDaysOfMonth(TheYear,TheMonth);
			
			if (AddDays >= Day1)
			{
				theTm.tm_mon += 1;
				
				TheMonth++;
				
				AddDays -= Day1;
			}
			else
			{
				// 直接更改天數(shù)
				theTm.tm_mday += AddDays;
				
				AddDays = 0;
			}
		}
	}
	
	int AddSeconds = MillionSeconds / 1000 + (MillionSeconds % 1000 > 500 ? 1 : 0);
	
	while(AddSeconds > 0)
	{
		if (AddSeconds >= 3600)
		{
			theTm.tm_hour += 1;
			
			AddSeconds -= 3600;
		}
		else if (AddSeconds >= 60)
		{
			theTm.tm_min += 1;
			
			AddSeconds -= 60;
		}
		else 
		{
			theTm.tm_sec += AddSeconds;
			
			AddSeconds = 0;
		}
	}
}

//int CMyDBF::GetDaysOfYears(int Year)
//{
//	if ((Year % 4 == 0) && ((Year % 100 != 0) || (Year % 400 == 0)))
//		return 366;
//	else 
//		return 365;
//}
//
//int CMyDBF::GetDaysOfMonth(int Year, int Month)
//{
//	switch(Month) {
//	case 1:
//		return 31;
//	case 2:
//		if ((Year % 4 == 0) && ((Year % 100 != 0) || (Year % 400 == 0)))
//			return 29;
//		else 
//			return 28;
//	case 3:
//		return 31;
//	case 4:
//		return 30;
//	case 5:
//		return 31;
//	case 6:
//		return 30;
//	case 7:
//		return 31;
//	case 8:
//		return 31;
//	case 9:
//		return 30;
//	case 10:
//		return 31;
//	case 11:
//		return 30;
//	case 12:
//		return 31;
//	default:
//		return 0;
//	}
// }
//	

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品福利一区二区三区免费视频| 成人免费视频播放| 欧美日韩国产另类一区| 亚洲一区在线视频观看| 欧美性生交片4| 美女视频网站久久| 久久网站最新地址| 不卡一区二区在线| 一区二区高清在线| 91精品国产aⅴ一区二区| 精品一区二区三区影院在线午夜 | 色综合久久中文综合久久97| 亚洲欧美日韩国产成人精品影院| 色爱区综合激月婷婷| 丝瓜av网站精品一区二区 | 91黄视频在线| 蜜桃在线一区二区三区| 亚洲精品一区二区三区影院| 99精品偷自拍| 日本va欧美va精品发布| 国产拍欧美日韩视频二区| 91国产免费看| 美女精品一区二区| 国产精品第13页| 制服丝袜激情欧洲亚洲| 粉嫩一区二区三区性色av| 亚洲免费高清视频在线| 精品粉嫩aⅴ一区二区三区四区| 国产成人av网站| 肉丝袜脚交视频一区二区| 国产丝袜欧美中文另类| 欧美日韩成人在线| 欧美成人女星排名| 色综合久久天天综合网| 精品中文字幕一区二区| 亚洲国产日日夜夜| 国产日韩成人精品| 日韩免费电影一区| 欧美影院精品一区| 成人app软件下载大全免费| 天天色 色综合| 亚洲欧美中日韩| 精品国产凹凸成av人导航| 日本精品一区二区三区高清| 国产精品资源在线看| 日韩高清欧美激情| 亚洲三级视频在线观看| 久久精品欧美日韩| 欧美一区二区福利在线| 91成人国产精品| 成人免费va视频| 国产美女主播视频一区| 日韩精品久久理论片| 樱花草国产18久久久久| 中文字幕亚洲在| 国产日产欧产精品推荐色| 日韩小视频在线观看专区| 欧美视频一区二区三区| 97久久精品人人爽人人爽蜜臀| 久久超碰97人人做人人爱| 亚洲高清免费在线| 亚洲精品一二三| 国产精品免费aⅴ片在线观看| 欧美成人aa大片| 欧美一区二区观看视频| 在线电影国产精品| 欧美日韩精品三区| 欧美日韩国产系列| 欧美性生活大片视频| 欧美性三三影院| 欧美午夜电影在线播放| 91久久精品一区二区| 91亚洲国产成人精品一区二区三 | 色视频一区二区| 99在线精品视频| 成人av影院在线| 91在线你懂得| 欧美在线观看视频一区二区 | 欧美体内she精视频| 在线视频一区二区免费| 欧美主播一区二区三区| 欧美日韩aaa| 欧美一级电影网站| 欧美成人官网二区| 久久久久综合网| 中文字幕精品在线不卡| 亚洲天天做日日做天天谢日日欢 | 国产精品丝袜久久久久久app| 久久精品人人做人人爽97| 国产欧美一区二区三区网站| 亚洲国产成人在线| 国产精品国产馆在线真实露脸| 椎名由奈av一区二区三区| 亚洲免费视频中文字幕| 亚洲成人你懂的| 麻豆精品一区二区三区| 丰满亚洲少妇av| 欧美最新大片在线看 | 欧美一二三区在线| 久久这里只有精品首页| 国产日韩精品一区二区三区| 亚洲日穴在线视频| 日韩高清一区在线| 国产精品一区专区| 一本一道久久a久久精品综合蜜臀| 欧美日韩一区中文字幕| 精品国产电影一区二区| 136国产福利精品导航| 天天色 色综合| 国产精品99久久久久久有的能看| 成人激情图片网| 欧美日韩综合在线免费观看| 欧美一区二区不卡视频| 国产网站一区二区| 亚洲一区二区三区影院| 青青草国产精品亚洲专区无| 国产成人丝袜美腿| 91官网在线免费观看| 91精品一区二区三区久久久久久 | 一区二区欧美国产| 蜜臀久久99精品久久久久宅男 | 国产一区二区免费看| 97精品久久久午夜一区二区三区| 欧美日韩一级黄| 国产日韩欧美a| 热久久一区二区| 97久久精品人人爽人人爽蜜臀| 日韩午夜激情电影| 亚洲一区二区三区四区在线观看| 狠狠久久亚洲欧美| 一本色道**综合亚洲精品蜜桃冫| 欧美电视剧免费观看| 亚洲欧美日韩一区二区 | 丝袜诱惑制服诱惑色一区在线观看| 国模大尺度一区二区三区| 色激情天天射综合网| 国产视频视频一区| 日韩专区在线视频| 欧洲亚洲精品在线| 亚洲欧洲日本在线| 国模冰冰炮一区二区| 欧美日韩卡一卡二| 自拍偷拍欧美激情| 成人理论电影网| 国产亚洲精品资源在线26u| 日韩精品一二三四| 欧美综合一区二区| 最新不卡av在线| 国产乱对白刺激视频不卡| 日韩欧美一区二区三区在线| 偷拍自拍另类欧美| 91欧美一区二区| 欧美激情综合五月色丁香小说| 久久99热99| 日韩一级视频免费观看在线| 午夜视黄欧洲亚洲| 91福利视频网站| 亚洲一区二区在线免费观看视频| 91在线免费播放| 亚洲天堂av一区| 99久久精品国产麻豆演员表| 国产精品久久久久久久久久久免费看 | 亚洲欧洲99久久| 成人在线视频首页| 久久精品亚洲乱码伦伦中文| 黑人精品欧美一区二区蜜桃| 337p亚洲精品色噜噜噜| 日本视频在线一区| 日韩一级黄色大片| 日日摸夜夜添夜夜添国产精品| 欧美揉bbbbb揉bbbbb| 午夜伊人狠狠久久| 91精品欧美一区二区三区综合在| 五月婷婷欧美视频| 日韩一区二区免费电影| 国产综合成人久久大片91| 久久男人中文字幕资源站| 粉嫩一区二区三区在线看| 欧美国产激情二区三区| 91日韩在线专区| 亚洲第一在线综合网站| 日韩一级大片在线观看| 国产东北露脸精品视频| 国产精品国产自产拍高清av王其| 91小视频在线| 午夜久久久影院| 久久日韩精品一区二区五区| 成人午夜精品一区二区三区| 中文字幕视频一区| 欧美午夜精品电影| 蜜桃视频一区二区三区在线观看| www国产成人| 99re热这里只有精品免费视频 | 国产精品青草久久| 色婷婷一区二区三区四区| 香蕉加勒比综合久久| 精品国内片67194| 99国产精品视频免费观看| 自拍偷拍亚洲综合| 6080yy午夜一二三区久久|