MFC文件操作
文件的操作分為兩步,打開和讀寫。
打開和讀寫對應著兩個類,分別 CFileDialog 和 CFile.
第一步? 打開文件對話框操作:
(1) 文件對話框類 CFileDialog
(2) 構造方法 CFileDialog::CFileDialog();
CFileDialog::CFileDialog(?BOOL?bOpenFileDialog,?LPCTSTR?lpszDefExt?=?NULL,?LPCTSTR?lpszFileName?=?NULL,
DWORD?dwFlags?=?OFN_HIDEREADONLY?|?OFN_OVERWRITEPROMPT,
LPCTSTR?lpszFilter?=?NULL,?CWnd*?pParentWnd?=?NULL?);
參數介紹:
bOpenFileDialog 為TRUE則顯示打開對話框,為FALSE則顯示保存對話文件對話框。
lpszDefExt 指定默認的文件擴展名。 如"jpg"。
lpszFileName 指定默認的文件名。 如"*.jpg"。
dwFlags 指明一些特定風格。如:dwFlags?=?OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT。
OFN_HIDEREADONLY? 隱藏只讀復選框。
OFN_OVERWRITEPROMPT? 如果選擇的文件已經存在,使用另存為對話框產生一個消息框;
用戶必須確認是否復蓋這個文件。
lpszFilter 是很重要的一個參數,它指明可供選擇的文件類型和相應的擴展名。參數格式如:
"jpg Files (*.jpg)|*.jpg|bin Files (*.bin)|*.bin|All Files (*.*)|*.*||";
文件類型說明和擴展名間用 | 分隔,每種文件類型間用 | 分隔,末尾用 || 指明。
pParentWnd 為父窗口指針,一般為空。
?
(3) 打開對話框方法 CFileDialog::DoModal(); 用來打開對話框。
?
(4) 取得完整文件名方法 CFileDialog::GetPathName();
得到完整的文件名,包括目錄名和擴展名如:c:\test\test1.txt。
構造和打開對話框用例:
char szFilters[]="jpg Files (*.jpg)|*.jpg|bin Files (*.bin)|*.bin|All Files (*.*)|*.*||";
CFileDialog fileDlg(TRUE, "jpg", "*.jpg",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilters, NULL);
if( fileDlg.DoModal ()==IDOK ) //此時,才真正彈出對話框。
{
gReadFilePathName = fileDlg.GetPathName(); //得到完整的文件名、目錄和擴展名。
GetDlgItem(IDC_EDIT1)->SetWindowText(gReadFilePathName); //將文件名、目錄和擴展名寫回窗口。
}
?
?
第二步? 讀寫文件操作:
(1) 文件類 CFile
?
(2) 構造方法 CFile::CFile();
CFile::CFile(?LPCTSTR?lpszFileName,?UINT?nOpenFlags?);?
lpszFileName 文件名
nOpenFlags? 打開方式,有:
CFile::modeCreate:以新建方式打開,如果文件不存在,新建;
如果文件已存在,把該文件長度置零,即清除文件原有內容。
CFile::modeRead:只讀。
CFile::modeWrite:只寫。
CFile::modeReadWrite:以讀寫方式打開文件。
CFile::modeNoTruncate:以追加方式打開,如果文件存在,打開并且不將文件長度置零,如果文件不存在,會拋出異常。
一般與CFile::modeCreate一起使用,則文件不存在時,新建一個文件;存在就進行追加操作。
用例如下:
CFile ReadFile(gReadFilePathName,CFile::modeRead);
CFile SaveFile(gSaveFilePathName,CFile::modeCreate|CFile::modeWrite);
?
(3) 只讀方法 CFile::Read();
CFile::Read(?void*?lpBuf,?UINT?nCount?);? 從lpBuf指向的地址開始讀取nCount?個字節,指針也自動下移nCount?.
lpBuf 文件指針
nCount? 字節數
用例如下:
unsigned char?temp;
ReadFile.Read(&temp,1);
?
(4) 只寫方法 CFile::Write();
CFile::Write(?const?void*?lpBuf,?UINT?nCount?);? 向lpBuf指向的內存地址寫入nCount?個字節,指針也自動下移nCount?.
lpBuf 文件指針
nCount? 字節數
用例如下:
?char?ChangRun[2] = {'\r','\n'};
SaveFile.Write(ChangRun,2);
?
(5) 定位方法 CFile::Seek();
CFile::Seek(?LONG?lOff,?UINT?nFrom?); 從指定位nFrom置偏移lOff字節.
nFrom? 有三種方式,如:
CFile::begin? 從文件開始移動
CFile::current 從當前位置移動
CFile::end? ?? 從文件末位移動,此時lOff為負值.
用例如下:
SaveFile.Seek(2,CFile::current);
?完。
總結
- 上一篇: 8种常用图像处理算法
- 下一篇: Matlab读和写图像需要注意的问题