UNICODE环境下读写txt文件操做
(2011-07-26 17:40:05)
本身动手整理了一下,写了几个函数,用于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; }