VC中檔案的操作

2021-05-22 07:12:09 字數 3996 閱讀 6218

各種關於檔案的操作在程式設計中是十分常見,如果能對其各種操作都瞭如指掌,就可以根據實際情況找到最佳的解決方案,從而在較短的時間內編寫出高效的**,因而熟練的掌握檔案操作是十分重要的。本文將對visual c++中有關檔案操作進行全面的介紹,並對在檔案操作中經常遇到的一些疑難問題進行詳細的分析。

1.檔案的查詢

當對乙個檔案操作時,如果不知道該檔案是否存在,就要首先進行查詢。mfc中有乙個專門用來進行檔案查詢的類cfilefind,使用它可以方便快捷地進行檔案的查詢。下面這段**演示了這個類的最基本使用方法。

cstring strfiletitle;

cfilefind finder;

bool bworking = finder.findfile("c://windows//sysbkup//*.cab");

while(bworking)

bworking=finder.findnextfile();

strfiletitle=finder.getfiletitle();

2.檔案的開啟/儲存對話方塊

讓使用者選擇檔案進行開啟和儲存操作時,就要用到檔案開啟/儲存對話方塊。mfc的類cfiledialog用於實現這種功能。使用cfiledialog宣告乙個物件時,第乙個bool型引數用於指定檔案的開啟或儲存,當為true時將構造乙個檔案開啟對話方塊,為false時構造乙個檔案儲存對話方塊。

在構造cfiledialog物件時,如果在引數中指定了ofn_allowmultiselect風格,則在此對話方塊中可以進行多選操作。此時要重點注意為此cfiledialog物件的m_ofn.lpstrfile分配一塊記憶體,用於儲存多選操作所返回的所有檔案路徑名,如果不進行分配或分配的記憶體過小就會導致操作失敗。下面這段程式演示了檔案開啟對話方塊的使用方法。

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.檔案的讀寫

檔案的讀寫非常重要,下面將重點進行介紹。檔案讀寫的最普通的方法是直接使用cfile進行,如檔案的讀寫可以使用下面的方法:

//對檔案進行讀操作

char sread[2];

cfile mfile(_t("user.txt"),cfile::moderead);

if(mfile.getlength()<2)

return;

mfile.read(sread,2);

mfile.close();

//對檔案進行寫操作

cfile mfile(_t("user.txt "), cfile::modewrite|cfile::modecreate);

mfile.write(sread,2);

mfile.flush();

mfile.close();

雖然這種方法最為基本,但是它的使用繁瑣,而且功能非常簡單。我向你推薦的是使用carchive,它的使用方法簡單且功能十分強大。首先還是用cfile宣告乙個物件,然後用這個物件的指標做引數宣告乙個carchive物件,你就可以非常方便地儲存各種複雜的資料型別了。它的使用方法見下例。

//對檔案進行寫操作

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

//對檔案進行讀操作

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的 << 和 >> 操作符用於簡單資料型別的讀寫,對於cobject派生類的物件的訪問要使用readobject()和writeobject()。使用carchive的readclass()和writeclass()還可以進行類的讀寫,如:

//儲存caboutdlg類

ar.writeclass(runtime_class(caboutdlg));

//讀取caboutdlg類

cruntimeclass* mrunclass=ar.readclass();

//使用caboutdlg類

cobject* pobject=mrunclass->createobject();

((cdialog* )pobject)->domodal();

雖然vc提供的文件/視結構中的文件也可進行這些操作,但是不容易理解、使用和管理,因此雖然很多vc入門的書上花費大量篇幅講述文件/視結構,但我建議你最好不要使用它的文件。關於如何進行文件/視的分離有很多書介紹,包括非常著名的《visual c++ 技術內幕》。

如果你要進行的檔案操作只是簡單的讀寫整行的字串,我建議你使用cstdiofile,用它來進行此類操作非常方便,如下例。

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.臨時檔案的使用

正規軟體經常用到臨時檔案,你經常可以會看到c:/windows/temp目錄下有大量的擴充套件名為tmp的檔案,這些就是程式執行是建立的臨時檔案。臨時檔案的使用方法基本與常規檔案一樣,只是檔名應該呼叫函式gettempfilename()獲得。它的第乙個引數是建立此臨時檔案的路徑,第二個引數是建立臨時檔名的字首,第四個引數用於得到建立的臨時檔名。得到此臨時檔名以後,你就可以用它來建立並操作檔案了,如:

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.檔案的複製、刪除等

mfc中沒有提供直接進行這些操作的功能,因而要使用sdk。sdk中的檔案相關函式常用的有copyfile()、createdirectory()、deletefile()、movefile()。它們的用法很簡單,可參考msdn。

VC中檔案操作的幾種方式(1,2)

第6章 使用檔案訪問物件 檔案可以用來儲存一張 清明上河圖 一曲 春江花月夜 當然也可以儲存一部 紅樓夢 檔案的內容依賴於應用程式來解釋。幾乎所有的作業系統都通過檔案的介面允許使用者儲存 管理資料。所以,我們理所當然把檔案當做資料訪問介質的第一選擇。6.1 檔案操作的幾種方式 操作計算機的人都會接觸...

VC中檔案操作的幾種方式(1,2)

第6章 使用檔案訪問物件 檔案可以用來儲存一張 清明上河圖 一曲 春江花月夜 當然也可以儲存一部 紅樓夢 檔案的內容依賴於應用程式來解釋。幾乎所有的作業系統都通過檔案的介面允許使用者儲存 管理資料。所以,我們理所當然把檔案當做資料訪問介質的第一選擇。6.1 檔案操作的幾種方式 操作計算機的人都會接觸...

VC中檔案操作的幾種方式(1,2)

第6章 使用檔案訪問物件 檔案可以用來儲存一張 清明上河圖 一曲 春江花月夜 當然也可以儲存一部 紅樓夢 檔案的內容依賴於應用程式來解釋。幾乎所有的作業系統都通過檔案的介面允許使用者儲存 管理資料。所以,我們理所當然把檔案當做資料訪問介質的第一選擇。6.1 檔案操作的幾種方式 操作計算機的人都會接觸...