【48】MFC入門到精通——MFC 文件讀寫總結 CFile、CStdioFile、CFileDialog

文章目錄

  • 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();
}

在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89767.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcode 124. 二叉樹中的最大路徑和

遞歸/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode…

MTSC2025參會感悟:手工測試用例的智能化生成

目錄 一、測試用例生成的時代困境與 AI 機遇 1.1 傳統手工測試用例的固有痛點 1.2 AI 時代的測試新挑戰 1.3 智能化轉型的機遇窗口 二、智能用例生成的核心特性與產品功能 2.1 核心特性解析 2.2 四大核心產品功能 功能一:基于 PRD 理解的一鍵生成用例 功能二…

后臺管理系統登錄模塊(雙token的實現思路)

最近在寫后臺管理,這里分享一下我的登錄模塊的實現,我是使用reacttypescript實現的,主要是登錄的邏輯和雙token的處理方式,請求接口的二次封裝aixos1.首先我們需要渲染登錄界面的窗口,這個很簡單就不詳細講解了&#x…

第十四講 | AVL樹實現

AVL樹實現一、AVL的概念二、AVL樹的實現1、AVL樹的結構2、AVL樹的插入(1)、AVL樹插入一個值的大概過程(2)、平衡因子更新更新原則更新停止條件插入結點及更新平衡因子的代碼實現3、旋轉(1)、旋轉的原則&…

《P3398 倉鼠找 sugar》

題目描述小倉鼠的和他的基(mei)友(zi)sugar 住在地下洞穴中,每個節點的編號為 1~n。地下洞穴是一個樹形結構。這一天小倉鼠打算從從他的臥室(a)到餐廳(b),而…

錘子助手插件功能六:啟用攔截消息撤回

錘子助手插件功能六:啟用攔截消息撤回錘子助手插件功能六:啟用攔截消息撤回🛡? 插件簡介 攔截撤回消息,信息不再消失🔧 功能說明?? 使用風險與注意事項🎯 適合人群?? 結語錘子助手插件功能六&#xf…

深度解析:基于EasyX的C++黑白棋AI實現 | 算法核心+圖形化實戰

摘要 本文詳解C黑白棋AI實現,使用EasyX圖形庫打造完整人機對戰系統。涵蓋: 遞歸搜索算法(動態規劃優化) 棋盤狀態評估函數設計 圖形界面與音效集成 勝負判定與用戶交互 附完整可運行代碼資源文件,提供AI難度調節方案…

樹同構(Tree Isomorphism)

樹同構(Tree Isomorphism)?? 是圖論中的一個經典問題,主要研究兩棵樹在結構上是否“相同”或“等價”,即是否存在一種節點的一一對應關系,使得兩棵樹的結構完全一致(不考慮節點的具體標簽或位置&#xff…

分享如何在保證畫質的前提下縮小視頻體積實用方案

大文件在通過互聯網分享或上傳時會遇到很多限制,比如電子郵件附件大小限制、社交媒體平臺的文件大小要求等。壓縮后的視頻文件更小,更容易上傳到網絡、發送給他人或共享在社交平臺上。它是一款無需安裝的視頻壓縮工具,解壓后直接運行&#xf…

SpringBoot 統一功能處理(攔截器、@ControllerAdvice、Spring AOP)

文章目錄攔截器快速入門攔截器詳解攔截路徑攔截器執行流程全局控制器增強機制(ControllerAdvice)統一數據返回格式(ControllerAdvice ResponseBodyAdvice)??全局異常處理機制??(ControllerAdvice ExceptionHandler)全局數據…

建筑墻壁損傷缺陷分割數據集labelme格式7820張20類別

數據集格式:labelme格式(不包含mask文件,僅僅包含jpg圖片和對應的json文件)圖片數量(jpg文件個數):7820標注數量(json文件個數):7820標注類別數:20標注類別名稱:["Graffiti","Bearing","Wets…

圖書管理軟件iOS(iPhone)

圖書管理軟件iOS(iPhone)開發進度表2025/07/19圖書管理軟件開發開始一:圖書管理軟件開發iOS(iPhone)

MySQL配置性能優化

技術文章大綱:MySQL配置性能優化賽 引言 介紹MySQL性能優化的重要性,特別是在高并發、大數據場景下的挑戰。概述MySQL配置優化的核心方向(如內存、查詢、索引等)。引出比賽目標:通過配置調整提升MySQL性能指標&#xf…

uniapp微信小程序 實現swiper與按鈕實現上下聯動

1. 需求:頁面頂部展示n個小圖標。當選中某個圖標時,下方視圖會相應切換;反之,當滑動下方視圖時,頂部選中的圖標也會同步更新。 2. 思路: 上方scroll-view 區域渲染圖標,并且可左右滑動&#xff…

44.sentinel授權規則

授權規則是對請求者的身份做一個判斷,有沒有權限來訪問。 需求:一般網關負責請求的轉發到微服務,可以做身份判斷。但是如果具體某個微服務的訪問地址直接透露給了外部,不是經過網關訪問過來的。那這種就沒有經過網關也就無法進行身份判斷了。這時候就需要sentinel的授權規…

[硬件電路-55]:絕緣柵雙極型晶體管(IGBT)的原理與應用

一、IGBT的原理:MOSFET與BJT的復合創新IGBT(Insulated Gate Bipolar Transistor)是一種復合全控型電壓驅動式功率半導體器件,其核心設計融合了MOSFET(金屬氧化物半導體場效應晶體管)的高輸入阻抗&#xff0…

取消office word中的段落箭頭標記

對于一個習慣用WPS的人來說,office word中的段落箭頭讓人非常難受,所以想要取消該功能點擊文件-更多-選項然后在顯示界面,找到段落標記,取消勾選即可最終效果

Win11 上使用 Qume 搭建銀河麒麟V10 arm版虛擬機

安裝全程需要下載3個文件,可在提前根據文章1.1、2.1、2.2網址下載。 1 QEMU軟件簡介與安裝流程 QEMU(Quick Emulator)是一個開源軟件,可以模擬不同的計算機硬件行為(如模擬arm架構),并可以創建…

[Linux]進程 / PID

一、認識進程 --- PCB寫一個死循環程序執行起來,觀察進程ps ajx 顯示所有進程用分號可以在命令行的一行中執行多條指令,也可以用 && :ps ajx | head -1 && ps ajx | grep proc終止掉進程后再查看:所以 ./p…

【人工智能99問】門控循環但單元(GRU)的結構和原理是什么?(13/99)

文章目錄GRU(Gated Recurrent Unit)的結構與原理一、GRU的結構與原理1. 核心組件2. 計算原理(數學公式)二、GRU的使用場景三、GRU的優缺點優點:缺點:四、GRU的訓練技巧五、GRU的關鍵改進六、GRU的相關知識與…