内容转载自http://blog.sina.com.cn/s/blog_5d2bad130100t0x9.html
UNICODE环境下读写txt文件操作
(2011-07-26 17:40:05)
标签:
杂谈 |
分类: MFC程序设计 |
自己动手整理了一下,写了几个函数,用于UNICODE环境下对txt文本文件的操作,针对txt文本的ANSIC编码格式,进行了字符编码格式的转换。
******************************************************************************
函 数 名 称:BOOL FileWriteline(CString &filename,CStringW &msg)
函 数 功 能:向文件filename末尾写入一行指定的内容(CStringW)
函 数 参 数:filename为所要写入的文件,msg为所要写入的内容
返 回 值:函数成功,返回TRUE,失败返回FALSE
*******************************************************************************
BOOL FileWriteline(CString &filename,CStringW &msg)
{
CStdioFile m_TextFile;
if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
return FALSE;
m_TextFile.SeekToEnd();
int ansiCount=WideCharToMultiByte(CP_ACP,0,msg,-1,NULL,0,NULL,NULL);
char * pTempChar=(char*)malloc(ansiCount*sizeof(char));//申请空间
memset(pTempChar,0,ansiCount);
WideCharToMultiByte(CP_ACP,0,msg,-1,pTempChar,ansiCount,NULL,NULL);//转换字符
m_TextFile.Write(pTempChar,strlen(pTempChar));
m_TextFile.Write("\n",1);
free(pTempChar);
m_TextFile.Close();
return TRUE;
}
******************************************************************************
函 数 名 称:CStringW FileReadline(CString &filename,int index)
函 数 功 能:从文件filename中读取指定行index的内容
函 数 参 数:filename为所要读取的文件,index为指定行数,从0开始
返 回 值:函数成功,返回读取的一行内容(CStringW),文件打开失败或文件内容
为空或是指定行数超过文件内容本身的行数,返回内容为空,
*******************************************************************************
CStringW FileReadline(CString &filename,int index)
{
CStringW rt;
int zline=file_nline(filename);
if(index>zline-1)
{
rt=_T("");
return rt;
}
CStdioFile m_TextFile;
if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead))
{
rt=_T("");
return rt;
}
int nline=0;
int i=0;
char a[1];
char *b;
b = new char[500];
while(m_TextFile.Read(a,1) && zline!=0)
{
if(nline==index && a[0]!=‘\n‘)
{
b[i]=a[0];
i++;
}
if(a[0]==‘\n‘)
{
zline--;
if(nline==index)
{
b[i]=‘\0‘;
break;
}
else
nline++;
}
}
int unicodeLen = MultiByteToWideChar( CP_ACP,0,b,-1,NULL,0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar( CP_ACP,0,b,-1,(LPWSTR)pUnicode,unicodeLen );
rt = ( wchar_t* )pUnicode;
m_TextFile.Close();
delete pUnicode;
delete b;
return rt;
}
******************************************************************************
函 数 名 称:int file_nline(CString &filename)
函 数 功 能:获取文件filename内容的行数
函 数 参 数:filename为所要写入的文件,msg为所要写入的内容
返 回 值:函数成功,返回filename的行数,失败或文件内容为空返回0
*******************************************************************************
int file_nline(CString &filename)
{
char a[1];
int nline=0;
CStdioFile m_TextFile;
if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead))
{
return nline;
}
while(m_TextFile.Read(a,1)!=0)
{
if(a[0]==‘\n‘)
nline++;
}
m_TextFile.Close();
return nline;
}
******************************************************************************
函 数 名 称:BOOL FileModifyline(CString &filename,int index,CStringW &msg)
函 数 功 能:获取文件filename第index行的内容为msg
函 数 参 数:filename为要修改的文件,index(从0开始)为行数,msg为要修改后的内容
返 回 值:函数成功,返回TRUE,失败返回FALSE
*******************************************************************************
BOOL FileModifyline(CString &filename,int index,CStringW &msg)
{
int k,nline;
nline=file_nline(filename);
if(index>nline-1)
return FALSE;
CStringW tempmsg;
CString tempfile(_T("temp.txt"));
for(k=0;k<nline;k++)
{
tempmsg=FileReadline(filename,k);
if(tempmsg.IsEmpty())
return FALSE;
if(k==index)
{
if(FileWriteline(tempfile,msg)==FALSE)
return FALSE;
}
else
{
if(FileWriteline(tempfile,tempmsg)==FALSE)
return FALSE;
}
}
CStdioFile modify;
modify.Remove(filename);
modify.Rename(tempfile,filename);
return TRUE;
}