一.CFile与CStdioFile的区别
1.CFile类,操作文件默认是Binary模式,CStdioFile类操作文件默认是Text模式在Binary模式下我们必须输入'\r\n',才能起到回车换行的效果,'\r'只是回车(回到当前行的第一列),'\n'只是换行(到达下一行的当前列)。而在Text模式下'\r'的工作是自动完成的,当我们写一个'\n'的时候,系统会自动帮我们在其前面加上一个'\r',然后保存到文件里。另外,CFile::typeText只能在CFile的子类中使用,CFile自身的Read函数不能使用CFile::typeText和CFile::typeBinary
2.File 是C和C++的函数! mfc中使用了CFile类进行相同的文件操作功能! CStdioFile继承了CFile 是CFile的子类,扩展了文本文件的操作,认识回车换行字符,可以进行一行字符串的读写!
3.Cfile类提供了基于二进制流的文件操作,功能类似于C语言中的fread()和fwrite()函数。CStdioFile提供了基于字符串流的文件操作,功能类似于C语言中的fgets()和fputs()函数。
4.CStdioFile继承了CFile类,特有的函数是ReadString(),WriteString(),但是不支持Duplicate(),Lockrange(),UnLockRange(),相当于流式文件的操作
void COpenfileDlg::OnFileOpen()
{
CFileDialog fo(TRUE,"*.txt","打开文件",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|所有文件|*.*||)");
if(IDCANCEL == fo.DoModal())
return;
CString path = fo.GetPathName();
CFile file;
if(!file.Open(path,CFile::modeRead))
{
AfxMessageBox("文件打开失败!");
return;
}
DWORD Len = file.GetLength(); //此长度是纯文本的长度
char * pBuf = new char[Len+1]; //此处设置Len+1,为在结尾加上0作为结束符
file.Read(pBuf,Len);
pBuf[Len] = 0;// 将非正文最后一位置零,遇到0结束,不再往下读,否则会读到错误的字节
SetDlgItemText(IDC_TEXT,pBuf);
file.Close();
delete pBuf;
}
void COpenfileDlg::OnFileSave()
{
CFileDialog fo(FALSE,"*.txt","保存文件",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|所有文件|*.*||)");
if(IDCANCEL == fo.DoModal())
return;
CString path = fo.GetPathName();
//方法一:CFile
/* CFile file;
if(!file.Open(path,CFile::modeWrite|CFile::modeCreate))
{
AfxMessageBox("文件打开失败!");
return;
}
CWnd * pWnd = GetDlgItem(IDC_TEXT);
int Len = pWnd->GetWindowTextLength();
char * pBuf = new char[Len+1];//此处设置Len+1,为隔行做伏笔
pBuf[Len] = 0;// 将非正文最后一位置零,遇到0结束,不再往下读,否则会写入错误的字节
pWnd->GetWindowText(pBuf,Len+1);
file.Write(pBuf,Len);
file.Close();
delete pBuf;*/
//方法二CStdioFile
CString strEdit1;
GetDlgItemText(IDC_TEXT, strEdit1);//获取指定ID的编辑框内
CStdioFile file;
if(file.Open(path, CStdioFile::modeCreate | CStdioFile::typeBinary | CStdioFile::modeWrite))
{
file.WriteString(strEdit1);
file.Close();
}
}