UNICODE环境下读写txt文件操做

内容转载自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; }
相关文章
相关标签/搜索