📄 filefun.cpp
字号:
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define DATA_BUFF 4096*2
CFileFunction::CFileFunction()
{
try
{
#ifdef _DEBUG
fCode.Open (TEXT("\\system.gps"),CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite);
#else
fCode.Open (TEXT("\\Storage Card\\system.gps"),CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite);
#endif
/*LPWSTR m_Buffer;
m_Buffer = (LPWSTR)malloc(2 * sizeof(WCHAR));
m_Buffer[0]=0xFEFF; //flag of UNICODE file
fCode.Write (m_Buffer,2);
free(m_Buffer);
m_Buffer = NULL;*/
}
catch(...)
{
//i=0;
MessageBox(NULL,TEXT("无法创建运营环境"),TEXT("系统警告信息"),MB_OK|MB_ICONWARNING);
}
}
CFileFunction::CFileFunction(TCHAR path[])
{
try
{
fCode.Open (path,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite);
LPWSTR m_Buffer;
m_Buffer = (LPWSTR)malloc(2 * sizeof(WCHAR));
m_Buffer[0]=0xFEFF; //flag of UNICODE file
fCode.Write (m_Buffer,2);
free(m_Buffer);
m_Buffer = NULL;
}
catch(...)
{
//i=0;
MessageBox(NULL,TEXT("无法创建运营环境"),TEXT("系统警告信息"),MB_OK|MB_ICONWARNING);
}
}
CFileFunction::~CFileFunction()
{
fCode.Close ();
}
/*
返回值:=-1没有找到
=-2内容过多
*/
int CFileFunction::ReadData(TCHAR title[],TCHAR name[],LPTSTR value)
{
try
{
int iLocal;
TCHAR ebuf[DATA_BUFF]=TEXT("\0");
iLocal=SeekLocal (title);
if (-2 == iLocal)//文件数据过多
{
return -2;
}
else if (-1 == iLocal)//第一次写数据:首先写标题,然后写键值
{
return -1;
}
else
{
//查询有没有相同的键值
int sKey=0,eKey;
sKey=SeekLocal(iLocal,name,eKey);
if(-1 == sKey)//没有找到
{
return -1;
}
else if(-2 == sKey)//没有找到
{
return -2;
}
else if (-3 == sKey)//已经到达处于文件尾
{
//添加内容:从键值开始处写内容
fCode.Seek(eKey,CFile::begin);
//fCode.Write(TEXT("\r\n"),4);
fCode.Read (ebuf,fCode.GetLength () - eKey);
LPTSTR pstr;
pstr=wcsstr(ebuf,TEXT("="));
if (NULL == pstr)
{
return -1;
}
else
{//找到数据
wcsncpy(value,pstr+1,wcslen(pstr)-1);
value[wcslen(pstr)-1]=0x0000;
return 1;
}
}
else
{
fCode.Seek(sKey,CFile::begin);
wcscpy(ebuf,TEXT("\0"));
fCode.Read (ebuf,eKey-sKey);
LPTSTR pstr;
pstr=wcsstr(ebuf,TEXT("="));
if (NULL == pstr)
{
return -1;
}
else
{//找到数据
wcsncpy(value,pstr+1,wcslen(pstr)-1);
value[wcslen(pstr)-1]=0x0000;
return 1;
}
}
}
return 0;
}
catch(...)
{
MessageBox(NULL,TEXT("读文件错误"),TEXT("提示信息"),MB_OK);
return 0;
}
}
int CFileFunction::WriteData (TCHAR title[],TCHAR name[],TCHAR value[])
{
try
{
int iLocal;
TCHAR ebuf[DATA_BUFF]=TEXT("\0");
wcscat(ebuf,title);
iLocal=SeekLocal (title);
wcscat(ebuf,TEXT("\0"));
if (-2 == iLocal)//文件数据过多
{
return 0;
}
else if (-1 == iLocal)//第一次写数据:首先写标题,然后写键值
{
//记录标题
fCode.SeekToEnd();
fCode.Write(TEXT("\r\n"),4);
fCode.Write(TEXT("["),2);
fCode.Write (title,wcslen(title)*2);
fCode.Write(TEXT("]"),2);
//记录内容
fCode.Write(TEXT("\r\n"),4);
fCode.Write (name,wcslen(name)*2);
fCode.Write(TEXT("="),2);
fCode.Write (value,wcslen(value)*2);
}
else
{
//查询有没有相同的键值
int sKey=0,eKey;
sKey=SeekLocal(iLocal,name,eKey);
if(-1 == sKey)//没有找到
{
//保存后续内容
fCode.Seek(iLocal,CFile::begin);
fCode.Read (ebuf,fCode.GetLength () - iLocal);
fCode.Seek(iLocal,CFile::begin);
//添加内容
fCode.Write(TEXT("\r\n"),4);
fCode.Write (name,wcslen(name)*2);
fCode.Write(TEXT("="),2);
fCode.Write (value,wcslen(value)*2);
//保存后面内容
fCode.Write(ebuf,fCode.GetLength () - iLocal);
}
else if(-2 == sKey)//文件数据过多
{
return 0;
}
else if (-3 == sKey)//已经到达处于文件尾
{
//添加内容:从键值开始处写内容
fCode.Seek(eKey,CFile::begin);
//fCode.Write(TEXT("\r\n"),4);
fCode.Write (name,wcslen(name)*2);
fCode.Write(TEXT("="),2);
fCode.Write (value,wcslen(value)*2);
fCode.SetLength (eKey+(wcslen(name)+wcslen(value))*2+2);//强制截断文件
}
else
{
//保存后面内容我
fCode.Seek(eKey,CFile::begin);
fCode.Read (ebuf,fCode.GetLength () - eKey);
//添加内容
fCode.SetLength (sKey);//强制截断文件
fCode.Seek(sKey,CFile::begin);
fCode.Write (name,wcslen(name)*2);
fCode.Write(TEXT("="),2);
fCode.Write (value,wcslen(value)*2);
//fCode.Write(TEXT("\r\n"),4);
fCode.SetLength (sKey+(wcslen(name)+wcslen(value))*2+2);//强制截断文件
//保存后面内容
fCode.Write(ebuf,wcslen(ebuf)*2);
}
}
return 0;
}
catch(...)
{
MessageBox(NULL,TEXT("写文件错误"),TEXT("提示信息"),MB_OK);
return 0;
}
}
/*
返回值:=-1:没有找到
=-2:内容太多
*/
int CFileFunction::SeekLocal(TCHAR title[])
{
fCode.SeekToBegin ();
TCHAR buf[DATA_BUFF]=TEXT("\0");
if (DATA_BUFF < fCode.GetLength())//数据内容太多
return -2;
fCode.Read(buf,fCode.GetLength());
LPTSTR pstr;
int iLocal;
pstr=wcsstr(buf,title);
if (NULL == pstr)//没有找到
{
iLocal=-1;
}
else
{
iLocal=(wcslen(buf)-wcslen(pstr)+wcslen(title))*2+2;
}
return iLocal;
}
/*
返回值:=-1:没有找到
=-2:内容太多
=-3:已经到达处于文件尾
*/
int CFileFunction::SeekLocal(int iLocal,TCHAR name[],int &overRet)
{
try
{
overRet=0;
fCode.Seek (iLocal,CFile::begin);//定位到SeekLocal()检索的位置
TCHAR buf[DATA_BUFF]=TEXT("\0");
if (DATA_BUFF < fCode.GetLength())//内容太多
return -2;
fCode.Read(buf,fCode.GetLength()-iLocal);
LPTSTR pstr;
int iRet;
TCHAR ebuf[DATA_BUFF]=TEXT("\0");
pstr=wcsstr(buf,name);//查找键值
if (NULL == pstr)//没有找到
{
iRet=-1;
}
else
{
wcscpy(ebuf,pstr);
wcsncpy(buf,buf,wcslen(buf)-wcslen(pstr));
buf[wcslen(buf)-wcslen(pstr)]=0x0000;
pstr=wcsstr(buf,TEXT("["));//开始检测是否为本类别键值
if (NULL == pstr)//没有 [ 说明为本类别键值
{
pstr=wcsstr(ebuf,TEXT("\r\n"));//结束位置
if (NULL == pstr)//已经是文件尾
{
overRet=iLocal+wcslen(buf)*2;//键值计算开始位置,而不再是键值结束位置
iRet=-3;
}
else
{
iRet=iLocal+wcslen(buf)*2;//键值开始位置
overRet=iRet+(wcslen(ebuf)-wcslen(pstr))*2;//简直结束位置
}
}
else//不是本类别的键值
{
iRet=-1;//没有找到
}
}
return iRet;
}
catch(...)
{
MessageBox(NULL,TEXT("不是本类别的键值"),TEXT("不是本类别的键值"),MB_OK);
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -