近来做的一个项目要做多语言,采用了把语言写到一个文件中的做法,这个文件要用unicode编码保存,等程序启动时,再从unicode文本中读取语言,刚开始在读取文本的时候用fgetws()来读取一行,没想到在EVC上可晕了,读出来的中间都多了1个0,后来就自己封装了个函数来读取一行文本:
#define MAX_TEXT_ITEM 256//共有的文字条目数
#define TEXT_ID_LENGTH 5//文字ID字符数
#define ONE_ITEM_LENGTH 32//每个字符串占得最大字符数
enum LANG_ID
{
LANG_KOR=0,
LANG_ENG=1,
LANG_CHS=2
};
enum GET_TEXT_RESULT
{
GET_TEXT_OK=0,//获取字符串OK
GET_TEXT_NOT_EXIST=1,//字符串ID不存在
GET_TEXT_ALREADY_CLOSE=2//该文件已经被关闭
};
TCHAR* textBuffer = NULL;
int textNum=0;
TCHAR* get_Line(TCHAR* pSrcBuffer, TCHAR* pDstBuffer, int iDstLen)
{
//读取一行数据
TCHAR* pData;
int iLen;
if(*pSrcBuffer==0 || iDstLen <=0) return NULL;
while(*pSrcBuffer==0x000d || *pSrcBuffer==0x000a)
pSrcBuffer++;
pData = pSrcBuffer;
while(*pData!=0x000d && *pData!=0x000a)
pData++;//直到换行或回车
iLen = (pData-pSrcBuffer)*sizeof(TCHAR);
if(iLen<=0) return NULL;
if(iDstLen<iLen) iLen = iDstLen;
memcpy(pDstBuffer,pSrcBuffer,iLen);
return pData;
}
//传入参数分别为语言ID,程序ID为整形,如程序ID为01,传参数为1
BOOL InitLang(LANG_ID id,int progId/*TCHAR* progId*/)
{
BOOL find = FALSE;
TCHAR tmp[48]={0};
TCHAR* file;
TCHAR pID[20];
int i, index;
FILE* fp;
int iFileLen;
int iReadLen;
char *pFileBuffer;
unsigned short *pData;
//申请存放文字ID和文字内容的内存
textBuffer = (TCHAR*)malloc(MAX_TEXT_ITEM*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)*sizeof(TCHAR));
if(textBuffer == NULL)
return FALSE;
memset(textBuffer,0,MAX_TEXT_ITEM*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)*sizeof(TCHAR));
if(LANG_CHS == id)
{
file = _T("//Windows//ebk_lang_chs.txt");
}
else if(LANG_ENG == id)
{
file = _T("//Windows//ebk_lang_eng.txt");
}
else if(LANG_KOR == id)
{
file = _T("//Windows//ebk_lang_kor.txt");
}
wcscpy(pID,_T("[progID]="));
TCHAR buf[20];
if(progId < 10)
{
wsprintf(buf,_T("0%d"),progId);
}
else
{
wsprintf(buf,_T("%d"),progId);
}
wcscat(pID,buf);
fp = _wfopen(file,_T("r"));
if(fp == NULL)
{
RETAILMSG(1, (TEXT(" File of %s is not exist!/r/n"),file));
return FALSE;
}
fseek(fp, 0, SEEK_END);
iFileLen = ftell(fp);
if(iFileLen <= 0)
{
fclose(fp);
return FALSE;
}
pFileBuffer = (char*)malloc(iFileLen);
if(pFileBuffer == NULL)
{
fclose(fp);
return FALSE;
}
fseek(fp, 0, SEEK_SET);
iReadLen = fread(pFileBuffer, 1, iFileLen, fp);
if(iReadLen < iFileLen)
{
free(pFileBuffer);
fclose(fp);
return FALSE;
}
fclose(fp);
pData = (unsigned short *)pFileBuffer;
if(*pData==0xfeff) pData++;//忽略零宽度不换行的空格
while(pData = get_Line(pData,tmp,48*sizeof(TCHAR)))
{
//根据程序ID查找到相应的段
if(0 == wcsncmp(tmp,pID,wcslen(pID)))
{
find = TRUE;
break;
}
}
//查找到相应段后开始读文字ID和文字内容
while(pData = get_Line(pData,tmp,48*sizeof(TCHAR)))
{
if(tmp[0] == _T('<'))
{
index=0;
//读取文字ID
for(i=1; i<TEXT_ID_LENGTH+1;i++)
{
textBuffer[textNum*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH) + index++] = tmp[i];
}
//读取文字内容
index=0;
for(i+=3;i<wcslen(tmp);i++)
{
if(tmp[i] != _T('"'))
{
textBuffer[textNum*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH + index++] = tmp[i];
}
else
break;
}
textBuffer[textNum*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH + index] = _T('/0');
textNum++;
}
else
break;
}
free(pFileBuffer);
if( find && textNum)
return TRUE;
return FALSE;
}
//根据字符串ID获取字符串,第1个参数为字符串ID,不包括程序ID,如在文件中是<02005>,传字符串ID为5,data为存放内容的内存。
GET_TEXT_RESULT getTextItem(/*TCHAR* ID*/int ID, TCHAR* data)
{
if(textBuffer == NULL)
{
return GET_TEXT_ALREADY_CLOSE;
}
TCHAR tmpId[4];
int index=0;
int i,j;
TCHAR buf[20];
if(ID < 10)
{
wsprintf(buf,_T("00%d"),ID);
}
else if(ID < 100)
{
wsprintf(buf,_T("0%d"),ID);
}
else if(ID < 1000)
{
wsprintf(buf,_T("%d"),ID);
}
for(i=0;i<=textNum;i++)
{
//从内存中取出ID号,仅取ID号中后3位
for(j=0;j<3;j++)
{
tmpId[j] = textBuffer[i*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+2+j];
}
tmpId[j] = _T('/0');
if(0 == wcscmp(tmpId,buf))
{
//取所需ID号对应的文字,最多取32个
for(j=0;j<ONE_ITEM_LENGTH;j++)
{
if(textBuffer[i*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH+j] != _T('/0'))
{
data[index++] = textBuffer[i*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH+j];
}
else
break;
}
data[index] = _T('/0');
return GET_TEXT_OK;
}
}
return GET_TEXT_NOT_EXIST;
}
//释放内存
void closeText()
{
textNum = 0;
free(textBuffer);
textBuffer = NULL;
}
分享到:
相关推荐
EVC 读取设备唯一ID
EVC下UNICODE的字符串的输出问题
1. 文本的绘制 2. 绘制线条 3. 绘制矩形 4. 绘制圆和椭圆 5. 绘制圆角矩形 6. 绘制多边形 7. 动画效果 8. 抓屏实验
EVC常用的应用软件实例讲解,详细而且全面。
EVC编程EVC编程知识以及源码。
EVC客户服务器端通信代码 EVC客户服务器端通信代码
EVC设置 vsphere evc设置
vmware EVC功能应用,集群开启EVC功能,解决ESXI主机不同CPU之间的兼容性
EVC开发实例,通过开发实例自己动手去做,很快上手EVC开发!!
EVC300智能体积修正仪(以下简称修正仪)是我公司专门为气体流量计设计生产的 款新型智能化显示仪。 该修正仪可实现温度、压力、压缩因子修正, 直接检测显示介质的温度、压力、工况体积总蜇、标况体积流星和总量,...
第一部分 基本控件介绍 ...3.文本控件 4.单选按钮 5. 复选按钮 第二部分 扩展控件介绍 1.组合框控件 2. 列表框控件 3.滚动条控件 4.树形控件 第三部分 一些其他的控件 时间控件、月历控件、微调按钮、滑动条、进度条
开发工具EVC
EVC很好的入门教材哦!
用EVC开发的程序,VS和EVC应该都可以打开,但是要装上相应的SDK
evc4.0序列号 保证能用 evc4.0序列号 保证能用
EVC文件学习的小例程,简单好用。包括文件的打开修改,保存
EVC 下的socket通信程序. 服务端在pc上, 客户端在ppc2003模拟器上运行可以通信
嵌入式.wince.EVC教程 embedded vc++教程,windowsCE教程,编程
如何定制一个eVC上的中文模拟器,图文并茂,作者讲的很好
EVC下数据库编写例程