CFile與CStdioFile的文件讀寫(xiě)使用方法詳解
CFile
//創(chuàng)建/打開(kāi)文件
CFile file;
file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
文件打開(kāi)模式可組合使用,用“|”隔開(kāi),常用的有以下幾種:
CFile::modeCreate:以新建方式打開(kāi),如果文件不存在,新建;如果文件已存在,把該文件長(zhǎng)度置零,即清除文件原有內(nèi)容。
CFile::modeNoTruncate:以追加方式打開(kāi),如果文件存在,打開(kāi)并且不將文件長(zhǎng)度置零,如果文件不存在,會(huì)拋出異常。一般與CFile::modeCreate一起使用,則文件不存在時(shí),新建一個(gè)文件;存在就進(jìn)行追加操作。
CFile::modeReadWrite:以讀寫(xiě)方式打開(kāi)文件。
CFile::modeRead:只讀。
CFile::modeWrite:只寫(xiě)。
//寫(xiě)入數(shù)據(jù)
CString strValue = "Hello World!";
file.Write(strValue,strValue.GetLength());
//追加數(shù)據(jù)
file.SeekToEnd(); //將指針移至文件末尾進(jìn)行追加
file.Write(strValue,strValue.GetLength());
//關(guān)閉文件
file.Close();
CStdioFile
CStdioFile是CFile的派生類(lèi),對(duì)文件進(jìn)行流式操作,對(duì)于文本文件的讀寫(xiě)很有用處,可按行讀取寫(xiě)入。
//寫(xiě)入數(shù)據(jù)
CString strValue = "Hello World!";
file.WriteString(strValue);
//讀取數(shù)據(jù)
CString strRead;
file.ReadString(strRead);
當(dāng)文件存在多行數(shù)據(jù)需要逐行讀取時(shí),可用函數(shù)BOOL CStdioFile::ReadString(CString& rString),當(dāng)遇到"/n "時(shí)讀取截?cái)?,如果文件未讀完,返回true,否則返回false。
//逐行讀取文件內(nèi)容,存入strRead
while(file.ReadString(strRead))
{
...;
}
各種關(guān)于文件的操作在程序設(shè)計(jì)中是十分常見(jiàn),如果能對(duì)其各種操作都了如指掌,就可以根據(jù)實(shí)際情況找到最佳的解決方案,從而在較短的時(shí)間內(nèi)編寫(xiě)出高效的代碼,因而熟練的掌握文件操作是十分重要的。本文將對(duì)Visual C++中有關(guān)文件操作進(jìn)行全面的介紹,并對(duì)在文件操作中經(jīng)常遇到的一些疑難問(wèn)題進(jìn)行詳細(xì)的分析。
1.文件的查找
當(dāng)對(duì)一個(gè)文件操作時(shí),如果不知道該文件是否存在,就要首先進(jìn)行查找。MFC中有一個(gè)專(zhuān)門(mén)用來(lái)進(jìn)行文件查找的類(lèi)CFileFind,使用它可以方便快捷地進(jìn)行文件的查找。下面這段代碼演示了這個(gè)類(lèi)的最基本使用方法。
CString strFileTitle;
CFileFind finder;
BOOL bWorking = finder.FindFile("C://windows//sysbkup//*.cab");
while(bWorking)
{
bWorking=finder.FindNextFile();
strFileTitle=finder.GetFileTitle();
}
2.文件的打開(kāi)/保存對(duì)話(huà)框
讓用戶(hù)選擇文件進(jìn)行打開(kāi)和存儲(chǔ)操作時(shí),就要用到文件打開(kāi)/保存對(duì)話(huà)框。MFC的類(lèi)CFileDialog用于實(shí)現(xiàn)這種功能。使用CFileDialog聲明一個(gè)對(duì)象時(shí),第一個(gè)BOOL型參數(shù)用于指定文件的打開(kāi)或保存,當(dāng)為T(mén)RUE時(shí)將構(gòu)造一個(gè)文件打開(kāi)對(duì)話(huà)框,為FALSE時(shí)構(gòu)造一個(gè)文件保存對(duì)話(huà)框。
在構(gòu)造CFileDialog對(duì)象時(shí),如果在參數(shù)中指定了OFN_ALLOWMULTISELECT風(fēng)格,則在此對(duì)話(huà)框中可以進(jìn)行多選操作。此時(shí)要重點(diǎn)注意為此CFileDialog對(duì)象的m_ofn.lpstrFile分配一塊內(nèi)存,用于存儲(chǔ)多選操作所返回的所有文件路徑名,如果不進(jìn)行分配或分配的內(nèi)存過(guò)小就會(huì)導(dǎo)致操作失敗。下面這段程序演示了文件打開(kāi)對(duì)話(huà)框的使用方法。
CFileDialog mFileDlg(TRUE,NULL,NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"All Files (*.*)|*.*||",AfxGetMainWnd());
CString str(" ",10000);
mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);
str.ReleaseBuffer();
POSITION mPos=mFileDlg.GetStartPosition();
CString pathName(" ",128);
CFileStatus status;
while(mPos!=NULL)
{
pathName=mFileDlg.GetNextPathName(mPos);
CFile::GetStatus( pathName, status );
}
3.文件的讀寫(xiě)
文件的讀寫(xiě)非常重要,下面將重點(diǎn)進(jìn)行介紹。文件讀寫(xiě)的最普通的方法是直接使用CFile進(jìn)行,如文件的讀寫(xiě)可以使用下面的方法:
//對(duì)文件進(jìn)行讀操作
char sRead[2];
CFile mFile(_T("user.txt"),CFile::modeRead);
if(mFile.GetLength()<2)
return;
mFile.Read(sRead,2);
mFile.Close();
//對(duì)文件進(jìn)行寫(xiě)操作
CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);
mFile.Write(sRead,2);
mFile.Flush();
mFile.Close();
雖然這種方法最為基本,但是它的使用繁瑣,而且功能非常簡(jiǎn)單。我向你推薦的是使用CArchive,它的使用方法簡(jiǎn)單且功能十分強(qiáng)大。首先還是用CFile聲明一個(gè)對(duì)象,然后用這個(gè)對(duì)象的指針做參數(shù)聲明一個(gè)CArchive對(duì)象,你就可以非常方便地存儲(chǔ)各種復(fù)雜的數(shù)據(jù)類(lèi)型了。它的使用方法見(jiàn)下例。
//對(duì)文件進(jìn)行寫(xiě)操作
CString strTemp;
CFile mFile;
mFile.Open("d://dd//try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
CArchive ar(&mFile,CArchive::store);
ar<<ar.Close();
mFile.Close();
//對(duì)文件進(jìn)行讀操作
CFile mFile;
if(mFile.Open("d://dd//try.TRY",CFile::modeRead)==0)
return;
CArchive ar(&mFile,CArchive::load);
ar>>strTemp;
ar.Close();
mFile.Close();
CArchive的 << 和>> 操作符用于簡(jiǎn)單數(shù)據(jù)類(lèi)型的讀寫(xiě),對(duì)于CObject派生類(lèi)的對(duì)象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()還可以進(jìn)行類(lèi)的讀寫(xiě),如:
//存儲(chǔ)CAboutDlg類(lèi)
ar.WriteClass(RUNTIME_CLASS(CAboutDlg));
//讀取CAboutDlg類(lèi)
CRuntimeClass* mRunClass=ar.ReadClass();
//使用CAboutDlg類(lèi)
CObject* pObject=mRunClass->CreateObject();
((CDialog* )pObject)->DoModal();
雖然VC提供的文檔/視結(jié)構(gòu)中的文檔也可進(jìn)行這些操作,但是不容易理解、使用和管理,因此雖然很多VC入門(mén)的書(shū)上花費(fèi)大量篇幅講述文檔/視結(jié)構(gòu),但我建議你最好不要使用它的文檔。關(guān)于如何進(jìn)行文檔/視的分離有很多書(shū)介紹,包括非常著名的《Visual C++ 技術(shù)內(nèi)幕》。
如果你要進(jìn)行的文件操作只是簡(jiǎn)單的讀寫(xiě)整行的字符串,我建議你使用CStdioFile,用它來(lái)進(jìn)行此類(lèi)操作非常方便,如下例。
CStdioFile mFile;
CFileException mExcept;
mFile.Open( "d://temp//aa.bat", CFile::modeWrite, &mExcept);
CString string="I am a string.";
mFile.WriteString(string);
mFile.Close();
4.臨時(shí)文件的使用
正規(guī)軟件經(jīng)常用到臨時(shí)文件,你經(jīng)??梢詴?huì)看到C:/Windows/Temp目錄下有大量的擴(kuò)展名為tmp的文件,這些就是程序運(yùn)行是建立的臨時(shí)文件。臨時(shí)文件的使用方法基本與常規(guī)文件一樣,只是文件名應(yīng)該調(diào)用函數(shù)GetTempFileName()獲得。它的第一個(gè)參數(shù)是建立此臨時(shí)文件的路徑,第二個(gè)參數(shù)是建立臨時(shí)文件名的前綴,第四個(gè)參數(shù)用于得到建立的臨時(shí)文件名。得到此臨時(shí)文件名以后,你就可以用它來(lái)建立并操作文件了,如:
char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];
GetTempPath(_MAX_PATH, szTempPath);
GetTempFileName(szTempPath,_T ("my_"),0,szTempfile);
CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite);
char m_char='a';
m_tempFile.Write(&m_char,2);
m_tempFile.Close();
5.文件的復(fù)制、刪除等
MFC中沒(méi)有提供直接進(jìn)行這些操作的功能,因而要使用SDK。SDK中的文件相關(guān)函數(shù)常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。它們的用法很簡(jiǎn)單,可參考MSDN。
1,判斷文件是否存在
access(filename,mode);
2,對(duì)于不同用途又不同的文件操作,其中API函數(shù)CreateFile()也是比較有用處理方式,對(duì)于巨型文件很合適的其他的樓上的大都說(shuō)了,不重復(fù)了.
[1]顯示對(duì)話(huà)框,取得文件名
CString FilePathName;
CFileDialog dlg(TRUE);///TRUE為OPEN對(duì)話(huà)框,F(xiàn)ALSE為S***E AS對(duì)話(huà)框
if (dlg.DoModal() == IDOK)
FilePathName=dlg.GetPathName();
相關(guān)信息:CFileDialog 用于取文件名的幾個(gè)成員函數(shù):
假如選擇的文件是C:/WINDOWS/TEST.EXE
則
(1)GetPathName();取文件名全稱(chēng),包括完整路徑。取回C:/WINDOWS/TEST.EXE
(2)GetFileTitle();取文件全名:TEST.EXE
(3)GetFileName();取回TEST
(4)GetFileExt();取擴(kuò)展名EXE
[2]打開(kāi)文件
CFile file("C:/HELLO.TXT",CFile::modeRead);//只讀方式打開(kāi)
//CFile::modeRead可改為 CFile::modeWrite(只寫(xiě)),
//CFile::modeReadWrite(讀寫(xiě)),CFile::modeCreate(新建)
例子:
{
CFile file;
file.Open("C:/HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);
.
.
.
}
[3]移動(dòng)文件指針
file.Seek(100,CFile::begin);///從文件頭開(kāi)始往下移動(dòng)100字節(jié)
file.Seek(-50,CFile::end);///從文件末尾往上移動(dòng)50字節(jié)
file.Seek(-30,CFile::current);///從當(dāng)前位置往上移動(dòng)30字節(jié)
file.SeekToBegin();///移到文件頭
file.SeekToEnd();///移到文件尾
[4]讀寫(xiě)文件
讀文件:
char buffer[1000];
file.Read(buffer,1000);
寫(xiě)文件:
CString string("自強(qiáng)不息");
file.Write(string,8);
[5]關(guān)閉文件
file.Close();
相關(guān)文章
C/C++實(shí)現(xiàn)磁盤(pán)相關(guān)操作的示例代碼
這篇文章主要為大家詳細(xì)介紹了C/C++如何實(shí)現(xiàn)磁盤(pán)相關(guān)操作,例如遍歷磁盤(pán)容量、實(shí)現(xiàn)磁盤(pán)格式化、移除指定磁盤(pán)等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言數(shù)組實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07深入理解C語(yǔ)言中編譯相關(guān)的常見(jiàn)錯(cuò)誤
本篇文章是對(duì)C語(yǔ)言中編譯相關(guān)的常見(jiàn)錯(cuò)誤進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++實(shí)現(xiàn)LeetCode(127.詞語(yǔ)階梯)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(127.詞語(yǔ)階梯),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C語(yǔ)言實(shí)現(xiàn)歌手大獎(jiǎng)賽計(jì)分程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)歌手大獎(jiǎng)賽計(jì)分程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03