文章目錄
- 1 打開文件
- 1.2 打開文件模式總結
- 2 常用函數
- 2.1 寫文件
- 2.2 讀文件
- 2.3 獲取文件長度
- 3. 文件打開讀寫實力
- 3.1 寫文件 覆蓋寫
- 3.2 文尾追加寫
- 3.3 換行寫
- 4 文件對話框 CFileDialog
- 4.2 文件對話框實例
- 5 CStdioFile 類 讀寫CSting
MFC提供了一個文件操作的基類CFile,這個類提供了一個沒有緩存的二進制格式的磁盤輸入輸出功能。通過他的派生類可以間接的支持文本、文件、內存文件等。
1 打開文件
通過對CFile類的初始化,即可完成文件的打開
//兩個參數表示 文件名和打開方式
CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
1.2 打開文件模式總結
CFile打開文件模式總結
2 常用函數
2.1 寫文件
寫文件時,需調用類的Write函數
void CFile::Write(const void* lpBuf, UINT nCount);
-
參數lpBuf:寫入數據的緩沖區
-
參數nCount:寫入數據的字符數
2.2 讀文件
讀文件時,調用類的Read函數
UINT CFile::Read(void* lpBuf, UINT nCount);
-
參數lpBuf:接收讀取數據的緩沖區
-
參數nCount:要讀取數據的字符數
-
返回值:返回讀取到緩沖區的字節數
在文件操作完畢后需要調用Close函數來關閉文件,如果在銷毀對象之前尚未關閉文件,析構函數將為您關閉該文件。如果使用new在堆上分配對象,則必須在關閉 file.setsto 后將其刪除。
2.3 獲取文件長度
我們可以使用CFile類的GetLength函數來獲取文件的長度
virtual ULONGLONG CFile::GetLength() const;
該函數可以返回我們打開的文件長度
3. 文件打開讀寫實力
3.1 寫文件 覆蓋寫
文件流類CFile—數據寫入文件
實例化一個對象對象使用open()函數打開文件,參數為文件路徑和打開類型數據寫入文件使用Write()關閉文件流Close()
void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知處理程序代碼CString sname = _T("zhangsan");CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite); //直接構建創建一個新文件。如果該文件已經存在,則文件內容自動被清零。int len = sname.GetLength();fout.Write(sname, len * 2);//CString每個字符占2個字節,所以存儲長度乘以2fout.Close();
}
3.2 文尾追加寫
但上面面的寫法存在問題,
問題:每錄入一次信息,前面的數據就會被刪除,如何解決數據被刪除覆蓋?
問題根源:因為每一次打開文件,文件寫指針都是在文件的開頭,所以數據會被刪除覆蓋。
(1)增加打開模式 表示追加
CFile::modeNoTruncate
該值一般modeCreate組合使用。如果創建的文件已經存在,那么它不會被清零。因而該文件能可靠的打開,或者新建一個文件或者打開一個現存文件。這對于打開一個可能存在可能不存在的設置文件十分有用。該選項通用可用于CStdioFile。
(2)文尾定位指針
CFile::SeekToEnd()
把文件指針定位至尾部
fout.SeekToEnd();
CFile::modeNoTruncate 和 CFile::SeekToEnd() 配合使用才能追加寫。
void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知處理程序代碼CString sname = _T("zhangsan");CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite+ CFile::modeNoTruncate);//新建或者打開一個現存文件,追加寫int len = sname.GetLength();//CFile::modeNoTruncate,表示追加// .SeekToEnd();表示在文件末尾插入。fout.SeekToEnd(); fout.Write(sname, len * 2);//加1代表多一個空格來間隔數據fout.Close();
}
3.3 換行寫
fout.Write("\n",1);
完整的輸入數據的代碼
void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知處理程序代碼CString sname = _T("zhangsan");CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite+ CFile::modeNoTruncate);//新建或者打開一個現存文件,追加寫int len = sname.GetLength();//CFile::modeNoTruncate,表示追加// .SeekToEnd();表示在文件末尾插入。fout.SeekToEnd(); fout.Write(sname, len * 2);//加1代表多一個空格來間隔數據fout.Write(_T("\r\n"),1);//數據換行fout.Close();
}
可以換行寫了,但有個問題,每個字符之間有個空格
上寫入的是CString字符,我們看一下
將寫入的字符換位 cahr * ,正常了.
void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知處理程序代碼char sname[] = "zhangsan";CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite+ CFile::modeNoTruncate);//新建或者打開一個現存文件,追加寫//CFile::modeNoTruncate,表示追加// .SeekToEnd();表示在文件末尾插入。fout.SeekToEnd(); fout.Write(sname, strlen(sname));//加1代表多一個空格來間隔數據fout.Write(_T("\r\n"), 1);//數據換行fout.Close();
}
4 文件對話框 CFileDialog
MFC 文件對話框 CFileDialog (打開文件 和 保存文件 對話框)
有時候我們希望能動態更改文件的讀寫位置,那么就可以使用CFileDialog類來實現這一功能。
CFileDialog類封裝了Windows常用的文件對話框。常用的文件對話框提供了一種簡單的與Windows標準相一致的文件打開和文件存盤對話框功能。
4.2 文件對話框實例
根據前面所講內容,給大家做個文件對話框實例。
1.創建一個基于對話框的MFC應用程序工程,名稱設為“MFCTest”。
2.修改主對話框IDD_MFCTEST_DIALOG的模板,刪除自動生成的“TODO: Place dialog controls here.”靜態文本框,
添加兩個編輯框,ID分別為IDC_OPEN_EDIT和IDC_SAVE_EDIT,
再添加兩個按鈕,ID分別設為IDC_OPEN_BUTTON和IDC_SAVE_BUTTON,
Caption(描述文字)分別設為“打開”和“保存”。
按鈕IDC_OPEN_BUTTON用于顯示打開文件對話框,編輯框IDC_OPEN_EDIT顯示在打開文件對話框中選擇的文件路徑。
按鈕IDC_SAVE_BUTTON用于顯示保存文件對話框,編輯框IDC_SAVE_BUTTON顯示在保存文件對話框中選擇的文件路徑。
3.分別為按鈕IDC_OPEN_BUTTON和IDC_SAVE_BUTTON添加點擊消息的消息處理函數
雙擊 打開 和 保存 按鈕 進入到CMFCTestDlg::OnBnClickedOpenButton()和CMFCTestDlg::OnBnClickedSaveButton()函數
4.修改兩個消息處理函數如下:
void CMFCTestDlg::OnBnClickedOpenButton()
{// TODO: 在此添加控件通知處理程序代碼// 設置過濾器TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");// 構造打開文件對話框 (TRUE創建打開文件對話框)CFileDialog fileDlg(TRUE,_T("txt"),NULL,0,szFilter,this);CString strFilePath;// 顯示打開文件對話框if (IDOK == fileDlg.DoModal()){// 如果點擊了文件對話框上的“打開”按鈕,則將選擇的文件路徑顯示到編輯框里strFilePath = fileDlg.GetPathName();SetDlgItemText(IDC_OPEN_EDIT,strFilePath);//讀取并顯示文件內容CFile file(strFilePath, CFile::modeRead);char* pBuf;DWORD dwFileLen = file.GetLength();pBuf = new char[dwFileLen + 1];pBuf[dwFileLen] = 0;file.Read(pBuf, dwFileLen);USES_CONVERSION;CString strBuf = A2W(pBuf);MessageBox(strBuf);file.Close();}
}void CMFCTestDlg::OnBnClickedSaveButton()
{// TODO: 在此添加控件通知處理程序代碼// 設置過濾器TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||");// 構造保存文件對話框(FALSE創建保存文件對話框。)CFileDialog fileDlg(FALSE, _T("doc"),_T("my"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter, this);CString strFilePath;// 顯示保存文件對話框if (IDOK == fileDlg.DoModal()){// 如果點擊了文件對話框上的“保存”按鈕,則將選擇的文件路徑顯示到編輯框里strFilePath = fileDlg.GetPathName();SetDlgItemText(IDC_SAVE_EDIT, strFilePath);//簡單的寫入文件CFile file;file.Open(strFilePath, CFile::modeCreate + CFile::modeWrite + CFile::modeNoTruncate);//新建或者打開一個現存文件,追加寫file.Write("Tom and Jerry", strlen("Tom and Jerry"));file.Close();}
}
上面顯示編輯框內容時,使用了Windows API函數SetDlgItemText,當然也可以先給編輯框關聯變量,然后再使用在創建對話框類和添加控件變量中介紹的
CDialogEx::UpdateData()函數,但是比較習慣使用SetDlgItemText函數,感覺比較靈活。
5.運行此程序
在結果對話框上點“保存”按鈕,顯示保存文件對話框如下:
在打開文件
到此,文件對話框就講完了,是不是依然很簡單?如果忘記了文件對話框類構造函數的參數意義,可以回到來看看或者在MSDN上查閱。
MFC 文件對話框-打開文件-保存文件 代碼下載
5 CStdioFile 類 讀寫CSting
CStdioFile繼承自CFile,它可以建立一個CStdioFile 對象,更好的讀寫CSting;
CStdioFile定義在"afx.h"頭文件中,因此在使用該類之前需要先引入該頭文件。
CString CMFCApplication1Dlg::ReadCString()
{CStdioFile file;//CStdioFile繼承自CFile,它可以建立一個CStdioFile 對象CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");if (!file.Open(FileName, CFile::modeRead))//新建或者打開一個現存文件,追加寫{return 0;}CString strLine = _T("");CString str;while (file.ReadString(strLine)){//輸出處理結果GetDlgItemText(IDC_STATIC_LOG, str);//獲取已顯示的文本str = str + _T("\r\n") + strLine;//加換行、加新的文本,ICR_Process_result即新的文件內容SetDlgItemText(IDC_STATIC_LOG, str);}file.Close();return str;
}int CMFCApplication1Dlg::WriteCStr()
{CStdioFile file;//CStdioFile繼承自CFile,它可以建立一個CStdioFile 對象CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");if (!file.Open(FileName, CFile::modeCreate + CFile::modeWrite + CFile::modeNoTruncate))//新建或者打開一個現存文件,追加寫{return 0;}CString s1 = _T("#sIpAddress\n");CString s2 = _T("192.168.1.64\n");CString s3 = _T("#sUserID\n");CString s4 = _T("admin\n");CString s5 = _T("#sPassword\n");CString s6 = _T("abcd1234\n");file.WriteString(s1);file.WriteString(s2);file.WriteString(s3);file.WriteString(s4);file.WriteString(s5);file.WriteString(s6);file.Close();return 0;
}void CMFCApplication1Dlg::OnBnClickedButtonReadcstr()
{// TODO: 在此添加控件通知處理程序代碼ReadCString();
}void CMFCApplication1Dlg::OnBnClickedButtonWritecstr()
{// TODO: 在此添加控件通知處理程序代碼WriteCStr();
}