16,472
社区成员
发帖
与我相关
我的任务
分享
void CTextEditorView::OnFileOpen()
{
CEdit& m_edit = GetEditCtrl();
isModified = m_edit.GetModify();
CString string;
int Choice;
m_edit.GetWindowText(string);
if(isNew && string.IsEmpty());
else if(isModified)
{
Choice = MessageBox(_T("是否将更改保存到 "+CurPath+"?"),_T("记事本"),
MB_YESNO|MB_ICONQUESTION);
if(Choice==IDYES)OnFileSave();
}
CString strText=_T("");
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"),AfxGetMainWnd());
if(dlg.DoModal() == IDOK)
{
CurPath=dlg.GetPathName();
CFile file(CurPath,CFile::modeReadWrite);
char read[50000];
memset(read,0,sizeof(read));
file.Read(read,file.GetLength());
for(unsigned i=0;i<file.GetLength();i++)
strText += read[i];
file.Close();
m_edit.SetFont(&font);
m_edit.SetWindowTextW(strText);
m_edit.SetModify(FALSE);
isNew=FALSE;
}
}
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);
}
}
}