⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csvfile.cpp

📁 3D游戏展示程序
💻 CPP
字号:
//--------------------------------------------------
//  Desc: CSV File Read & Write
//  Copyright (C) 2007 Artsylee
//
//--------------------------------------------------

//--------------------------------------------------
//  描述: 提供一个简单的CSV文件读写模型
//  对CSV文件作一些限制, 以后再改进.
//  1, 值不包含(| '\"' | ',' | ' ' | '\t' |)
//  2, 文件开头无描述行.
//  3, 行尾无逗号(可以有逗号).
//  4, 每个记录的Field数一致.
//  5, 写记录暂时不实现.
//--------------------------------------------------

#include "CSVFile.h"
#include "Common.h"

CSVFile::CSVFile(void)
{
	m_Index = 0;
	m_FieldNum = 0;
}

CSVFile::CSVFile(const char *pFileName)
{
	m_Index = 0;
	m_FieldNum = 0;
	Open(pFileName);
}

CSVFile::~CSVFile(void)
{
	m_Datamap.clear();
}

//--------------------------------------------------
// 打开CSV文件
//--------------------------------------------------
bool CSVFile::Open(const char *pFileName)
{
	if(pFileName==NULL)
	{
		WriteLog(INFO_ERROR, "pFileName=NULL! [CSVFile::Open]");
		return false;
	}
	strcpy(m_FileName, pFileName);

	FILE *fp;
	fp=fopen(pFileName, "rb");
	if(fp==NULL)
	{
		WriteLog(INFO_ERROR, "Can't open CSV file [%s] !",pFileName);
		return false;
	}

	m_Datamap.clear();
	m_Index = 0;
	char szTemp[1024];
	size_t length;
	while(fgets(szTemp, 1024, fp))
	{
		length = strlen(szTemp);
		if(length<=2)	
			continue;

		if(szTemp[length-1] == '\n')
		{
			szTemp[length-1] = '\0';
		}
		if(szTemp[length-2] == '\r')
		{
			szTemp[length-2] = '\0';
		}
		m_Datamap[m_Index] = string(szTemp);
		m_Index++;
	}
	fclose(fp);

	if(m_Index>0)
	{
		strcpy(szTemp, m_Datamap[0].c_str());
		int field = 0;
		for(size_t i=0; i<strlen(szTemp); i++)
		{
			if(szTemp[i] == ',')
			{
				field++;
			}
		}
		// 此处可能有问题
		if(szTemp[strlen(szTemp)-1] == ',')
		{
			m_FieldNum = field+1;
		}
		else
		{
			m_FieldNum = field+1;
		}
	}
	//--------------------------------------------------
	// TEST
	//--------------------------------------------------
	return true;
}

bool CSVFile::Save(const char *pFileName/* =NULL */)
{
	return true;
}

size_t CSVFile::GetRecordCount(void)
{
	return m_Index;
}

size_t CSVFile::GetFieldCount(void)
{
	return m_FieldNum;
}

//--------------------------------------------------
// 根据行数获取记录字符串
//--------------------------------------------------
char* CSVFile::ReadRecord(size_t recordindex, char *pBuffer)
{
	if(pBuffer == NULL)	return NULL;
	if(recordindex>=m_Index)
	{
		pBuffer[0] = '\0';
		return NULL;
	}
	strcpy(pBuffer, m_Datamap[recordindex].c_str());
	return pBuffer;
}

//--------------------------------------------------
// 根据某列上指定值(整型)获取从recordindex开始的第N
// 条记录的行数(为-1代表无匹配值)
//--------------------------------------------------
int CSVFile::GetRecordIndex(size_t recordindex, size_t fieldindex, int value, int counter /* = 0 */)
{
	if(recordindex>=m_Index)
	{
		return -1;
	}
	if(fieldindex>=m_FieldNum)
	{
		return -1;
	}
	int num = 0;
	for(size_t i=recordindex; i<m_Index; i++)
	{
		// 尽量使value的值与默认返回值不等
		if(ReadInt32(i, fieldindex, -999999) == value)
		{
			if(num==counter)
				return (int)(i);
			else
				num++;
		}
	}
	return -1;
}

//--------------------------------------------------
// 根据某列上指定值(字符型)获取从recordindex开始的第
// N条记录的行数(为-1代表无匹配值)
//--------------------------------------------------
int CSVFile::GetRecordIndex(size_t recordindex, size_t fieldindex, const char *pValue, int counter /* = 0 */)
{
	if(recordindex>=m_Index)
	{
		return -1;
	}
	if(fieldindex>=m_FieldNum)
	{
		return -1;
	}
	char szTemp[256];
	int num = 0;
	for(size_t i=recordindex; i<m_Index; i++)
	{
		// 尽量使value的值与默认返回值不等
		if(ReadString(i, fieldindex, szTemp, "artsylee is good"))
		{
			if(strcmp(szTemp, pValue)==0)
			{	
				if(num==counter)
					return (int)(i);
				else
					num++;
			}
		}
	}
	return -1;
}

//--------------------------------------------------
// 根据某列上指定值获取相同值的记录数
// 没有则返回0
//--------------------------------------------------
int CSVFile::GetRecordNumber(size_t fieldindex, int value)
{
	int number = 0;
	if(fieldindex>=m_FieldNum)
	{
		return number;
	}
	for(size_t i=0; i<m_Index; i++)
	{
		// 尽量使value的值与默认返回值不等
		if(ReadInt32(i, fieldindex, -969696) == value)
		{
			number++;
		}
	}
	return number;
}

//--------------------------------------------------
// 根据某列上指定值获取相同值的记录数
// 没有则返回0
//--------------------------------------------------
int CSVFile::GetRecordNumber(size_t fieldindex, const char *pValue)
{
	int number = 0;
	if(fieldindex>=m_FieldNum)
	{
		return number;
	}
	char szTemp[256];
	for(size_t i=0; i<m_Index; i++)
	{
		// 尽量使value的值与默认返回值不等
		if(ReadString(i, fieldindex, szTemp, "artsylee is good"))
		{
			if(strcmp(szTemp, pValue)==0)
				number++;
		}
	}
	return number;
}

//--------------------------------------------------
// 获取指定位置的32位整数
//--------------------------------------------------
int CSVFile::ReadInt32(size_t recordindex, size_t fieldindex, int value /* = 0 */)
{
	char szTemp[256];
	if(ReadString(recordindex, fieldindex, szTemp))
	{
		char *p = NULL;
		return atoi(szTemp);
	}

	return value;
}

//--------------------------------------------------
// 获取指定位置的32位无符号数
//--------------------------------------------------
unsigned CSVFile::ReadUint32(size_t recordindex, size_t fieldindex, unsigned value /* = 0 */)
{
	char szTemp[256];
	if(ReadString(recordindex, fieldindex, szTemp))
	{
		char *p = NULL;
		return (unsigned)strtoul(szTemp, 0, 0);
	}

	return value;
}

//--------------------------------------------------
// 获取指定位置的浮点数
//--------------------------------------------------
float CSVFile::ReadFloat(size_t recordindex, size_t fieldindex, float value /* = 0.0f */)
{
	char szTemp[256];
	if(ReadString(recordindex, fieldindex, szTemp))
	{
		char *p = NULL;
		return (float)strtod(szTemp, &p);
	}

	return value;
}

//--------------------------------------------------
// 获取指定位置的字符串
//--------------------------------------------------
bool CSVFile::ReadString(size_t recordindex, size_t fieldindex, char *pBuf, const char *pDefault /* = "" */)
{
	if(pBuf == NULL)	return false;
	if(recordindex>=m_Index)
	{
		strcpy(pBuf, pDefault);
		return false;
	}
	if(fieldindex>=m_FieldNum)
	{
		strcpy(pBuf, pDefault);
		return false;
	}
	if(!GetSubString(m_Datamap[recordindex].c_str(), pBuf, fieldindex))
	{
		strcpy(pBuf, pDefault);
		return false;
	}
	return true;
}

//--------------------------------------------------
// 获取字符串的子串
//--------------------------------------------------
bool CSVFile::GetSubString(const char *pString, char *pResult, size_t field)
{
	if(pString==NULL || pResult == NULL)	
		return false;

	size_t token = 0;
	for(size_t i=0; i<strlen(pString); i++)
	{
		if(token == field)
		{
			int resnum = 0;
			while(pString[i] != ',' && i<strlen(pString))
			{
				pResult[resnum] = pString[i];
				resnum++;
				i++;
			}
			pResult[resnum] = 0;
			return true;
		}
		else if(pString[i] == ',')
		{
			token++;
		}
	}
	pResult[0] = 0;
	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -