之前在网上搜了很多相关的帖子,虽说这个不是很难,只是介绍不是很具体,有的只是Write的,下面两个读写要配套,要不然会出错。我就稍微做下总结,不过我不做重复性的工作,只是讲点容易忽视的。
我就直接上代码,然后再讲解。
这个代码主要是从把CString保存到txt文件中去。
CString cstrFilePath;
CFileDialog dlg(FALSE,_T("*.txt"),m_strCurTeachFileName,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY |OFN_CREATEPROMPT,_T("文本文档 (*.txt)|*.txt||"),this);
//TRUE为OPEN对话框,FALSE为SAVE AS对话框
if(dlg.DoModal()==IDOK)
{
cstrFilePath=dlg.GetPathName();
m_strCurTeachFileName=dlg.GetFileName();
CFile cfile;
cfile.Open(cstrFilePath,CFile::modeCreate | CFile::modeReadWrite);
UpdateData(true);
cfile.Write((LPCTSTR)m_strCodeContent.GetBuffer(m_strCodeContent.GetLength()),m_strCodeContent.GetLength()*sizeof(TCHAR));
cfile.Flush();
cfile.Close();
cstrFilePath.Replace(_T("txt"),_T("xml"));
m_curXmlFile.Save(cstrFilePath);
AfxMessageBox(_T("保存成功"));
m_strCurTeachFileName=_T("");
}
下面的是从txt文件中读出数据给CString
CFileDialog dlg(TRUE,_T("*.txt"),NULL,OFN_HIDEREADONLY |OFN_CREATEPROMPT,_T("文本文档 (*.txt)|*.txt|所有文件(*.*)|*.*||"),this); if(dlg.DoModal() == IDOK) { CFile file; cstrFilePath=dlg.GetPathName(); m_strCurTeachFileName=dlg.GetFileTitle ( ); file.Open(cstrFilePath,CFile::modeReadWrite); file.SeekToBegin(); file.Read(m_strCodeContent.GetBuffer(file.GetLength()),file.GetLength()); file.Close();
m_strCodeContent.ReleaseBuffer();UpdateData(false);
}
我是利用CFileDialog这个类实现一个保存的窗口,这个类我就不具体介绍了,我认为这个讲的还行,可以好好看看这个,提供一个链接http://hi.baidu.com/gootyking/item/38abf81fd8099cfa64eabf2f。
CFile这个类主要实现对文件的读写,我就随便找个帖子,大家先看这个链接http://www.datarelab.com/blog/Technical_literature/63.html,大致了解下CFile。
读完了上面的CFile的链接,可能还是对CString读写有点迷糊有点迷糊,我先补充点Read和Write这两个函数的理解:
Read( void* lpBuf, UINT nCount ) lpBuf是从文件中读取到的数据的内存Buf指针,nCount是从文件读取的字节数
Write( const void* lpBuf, UINT nCount ) lpBuf是写入文件数据的内存Buf指针,nCount是Buf里需要写入文件的字节数
我们怎么给CString提供一块内存呢,这就通过CString的GetBuffer()这个函数,我再给大家介绍个帖子http://www.cnblogs.com/jamesmile/archive/2010/04/19/1715756.html,我提醒一下这个GetBuffer函数,它不是从外部分配,而是从内部分配。