txt文件读取和保存操作,该如何处理
txt文件读取和保存操作
RT
txt文档编码格式为UTF8,以前只做过ANSI的,谁有这方面的例子或者链接告诉我一下呗
谢谢
------解决方案--------------------
参考:
RT
txt文档编码格式为UTF8,以前只做过ANSI的,谁有这方面的例子或者链接告诉我一下呗
谢谢
------解决方案--------------------
参考:
- C/C++ code
// CEditStringDoc serialization void CEditStringDoc::Serialize(CArchive& ar) { BOOL FirstLine=TRUE; WCHAR wBuf[2048]; char szBuf[2048]; int i=0; BOOL LineEnd=FALSE; char type[10]; char dummy[10]; char *pLine=0; char UniHead[4]={(char)0xEF,(char)0xBB,(char)0xBF,(char)0}; char UtfHead[3]={(char)0xFF,(char)0xFE,(char)0}; /* EF BB BF UTF-8 FE FF UTF-16/UCS-2, little endian FF FE UTF-16/UCS-2, big endian FF FE 00 00 UTF-32/UCS-4, little endian. 00 00 FE FF UTF-32/UCS-4, big-endian. */ CFile *pFile=ar.GetFile(); CString name=pFile->GetFileTitle();// if((name.Find(".htm")==-1) && (name.Find(".txt")==-1)) { AfxMessageBox("Only suports *.htm or *.txt files!"); return; } // memset(type,0,10); memset(dummy,0,10); // if (ar.IsStoring()) { // TODO: add storing code here int all=m_TextArray.GetSize(); for (int kk=0;kk<all;kk++) { strcpy(szBuf,m_TextArray[kk].GetBuffer(2048)); strcat(szBuf,"\r\n"); if(FirstLine) { if (m_UTF8) ar.Write(UniHead,3); else if (m_UNICODE) ar.Write(UtfHead,2); }// end 1st line if(m_UTF8) { MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048); WideCharToMultiByte(CP_UTF8,0,wBuf,-1,szBuf,2048,0,0); ar.Write(szBuf,strlen(szBuf)); } if(m_UNICODE) { MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048); ar.Write(wBuf,2*wcslen(wBuf)); } else { ar.Write(szBuf,strlen(szBuf)); } FirstLine=FALSE; }// end for }// end save else {// if UTF8 file the 1st 3 chars are: EFh,BBh,BFh // if UNICODE file the 1st 2 chars are :FFh,FEh // TODO: add loading code here m_TextArray.RemoveAll(); memset(szBuf,0,sizeof(szBuf)); while(ar.Read(&szBuf[i],1)) {// if(FirstLine) { if( (szBuf[0]!=(char)0xEF) && (szBuf[0]!=(char)0xBB) && (szBuf[0]!=(char)0xBF) && (szBuf[0]!=(char)0xFF) && (szBuf[0]!=(char)0xFE) ) {// normal file m_UTF8=FALSE; m_UNICODE=FALSE; FirstLine=FALSE; i++; continue; } if( szBuf[0]==(char)0xEF) { type[0]=szBuf[0]; continue; } if( szBuf[0]==(char)0xBB) { type[1]=szBuf[0]; continue; } if( szBuf[0]==(char)0xBF) { type[2]=szBuf[0]; } // Is UTF8 file ? if( (type[0]==(char)0xEF) && (type[1]==(char)0xBB) && (type[2]==(char)0xBF) ) {// UTF8 file m_UTF8=TRUE; m_UNICODE=FALSE; FirstLine=FALSE; continue;//i=0 } // Is UNICODE file ? if( szBuf[0]==(char)0xFF) { type[0]=szBuf[0]; continue; } if( szBuf[0]==(char)0xFE) { type[1]=szBuf[0]; } if( (type[0]==(char)0xFF) && (type[1]==(char)0xFE) ) { m_UNICODE=TRUE; m_UTF8=FALSE; FirstLine=FALSE; continue;//i=0 } }// end firstline // check line end if(szBuf[i]==0x0D) {// LineEnd=TRUE; szBuf[i]=0; ar.Read(dummy,1);//00 or 0a if(m_UNICODE) { szBuf[i+1]=0; ar.Read(dummy,2);//0a 00 } } // if(LineEnd) { if(m_UTF8) {// utf8 file MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048); WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0); pLine=szBuf; } else if(m_UNICODE) {// Unicode file WideCharToMultiByte(CP_ACP,0,(WCHAR *)szBuf,-1,(char *)wBuf,2048,0,0); pLine=(char *)wBuf; } else {// normal file pLine=szBuf; } LineEnd=FALSE;// new line i=-1;// +1=0 szBuf[0] //add m_TextArray.Add(pLine); memset(szBuf,0,sizeof(szBuf)); }// end LineEnd i++;//from 0 }// end while // if file end but no LF if(szBuf[0]!=0) m_TextArray.Add(szBuf);// last line if(m_TextArray.GetSize()!=0) { UpdateAllViews(0); } } }