c++檔案的概念
迄今為止,我們討論的輸入輸出是以系統指定的標準裝置(輸入裝置為鍵盤,輸出裝置為顯示器)為物件的。在實際應用中,常以磁碟檔案作為物件。即從磁碟檔案讀取資料,將資料輸出到磁碟檔案。磁碟是計算機的外部儲存器,它能夠長期保留資訊,能讀能寫,可以重新整理重寫,方便攜帶,因而得到廣泛使用。
檔案(file)是程式設計中乙個重要的概念。所謂「檔案」,一般指儲存在外部介質上資料的集合。一批資料是以檔案的形式存放在外部介質(如磁碟、光碟和u盤)上的。操 作系統是以檔案為單位對資料進行管理的,也就是說,如果想找存在外部介質上的資料, 必須先按檔名找到所指定的檔案,然後再從該檔案中讀取資料。要向外部介質上儲存資料也必須先建立乙個檔案(以檔名標識),才能向它輸出資料。
外存檔案包括磁碟檔案、光碟檔案和u盤檔案。目前使用最廣泛的是磁碟檔案,為敘述方便,教程中凡用到外存檔案的地方均以磁碟檔案來代表,在程式中對光碟檔案和u盤檔案的使用方法與磁碟檔案相同。
對使用者來說,常用到的檔案有兩大類,一類是程式檔案(program file),如c++的源程式檔案(.cpp)、目標檔案(.obj)、可執行檔案(.exe)等。一類是資料檔案(data file), 在程式執行時,常常需要將一些資料(執行的最終結果或中間資料)輸出到磁碟上存放起來,以後需要時再從磁碟中輸入到計算機記憶體。這種磁碟檔案就是資料檔案。程式中的輸入和輸出的物件就是資料檔案。
根據檔案中資料的組織形式,可分為ascii檔案和二進位制檔案。ascii檔案又稱文字(text)檔案或字元檔案,它的每乙個位元組放乙個ascii**,代表乙個字元。二進位制檔案又稱內部格式檔案或位元組檔案,是把記憶體中的資料按其在記憶體中的儲存形式原樣輸出到磁碟上存放。
對於字元資訊,在記憶體中是以ascii**形式存放的,因此,無論用ascii檔案輸出還是用二進位制檔案輸出,其資料形式是一樣的。但是對於數值資料,二者是不同的。例如有乙個長整數100000,在記憶體中佔4個位元組,如果按內部格式直接輸出,在磁碟檔案中佔 4個位元組,如果將它轉換為ascii碼形式輸出,則要佔6個位元組。
用ascii碼形式輸出的資料是與字元一一對應的,乙個位元組代表乙個字元,可以直接在螢幕上顯示或列印出來。這種方式使用方便,比較直觀,便於閱讀,便於對字元逐個進行輸入輸出。但一般佔儲存空間較多,而且要花費轉換時間(二進位制形式與ascii碼間的轉換)。用內部格式(二進位制形式)輸出數值,可以節省外存空間,而且不需要轉換時間,但乙個位元組並不對應乙個字元,不能直接顯示檔案中的內容。如果在程式執行過程中有些中間結果資料暫時儲存在磁碟檔案中,以後又需要輸入到記憶體的,這時用二進位制檔案儲存是最合適的。如果是為了能顯示和列印以供閱讀,則應按ascii碼形式輸出。此時得到的是ascii檔案,它的內容可程式設計客棧以直接在顯示屏上**。
c++提供了低階的i/o功能和高階的i/o功能。高階的i/o功能是把若干個位元組組合為乙個有意義的單位(如整數、單精度數、雙精度數、字串或使用者自定義的型別的資料),然後以ascii字元形式輸入和輸出。例如將資料從記憶體送到顯示器輸出,就屬於高階i/o功能,先將記憶體中的資料轉換為ascii字元,然後分別按整數、單精度數、雙精度數等形式輸出。這種面向型別的輸入輸出在程式中用得很普遍,使用者感到方便。但在傳輸大容量的檔案時由於資料格式轉換,速度較慢,效率不高。
所謂低階的i/o功能是以位元組為單位輸入和輸出的,在輸入和輸出時不進行資料格式的轉換。這種輸入輸出是以二進位制形式進行的。通常用來在記憶體和裝置之間傳輸一批位元組。這種輸入輸出速度快、效率高,一般大容量的檔案傳輸用無格式轉換的i/o。但使用時會感到不大方便。
c++檔案的開啟與關閉
這裡講一下如何開啟和關閉磁碟上的檔案,其他外設(u盤、光碟等)上的檔案與此相同。
開啟檔案
所謂開啟(open)檔案是一種形象的說法,如同開啟房門就可以進入房間活動一樣。 開啟檔案是指在檔案讀寫之前做必要的準備工作,包括:
為檔案流物件和指定的磁碟檔案建立關聯,以便使檔案流流向指定的磁碟檔案。
指定檔案的工作方式,如,該檔案是作為輸入檔案還是輸出檔案,是ascii檔案還是二進位制檔案等。
以上工作可以通過兩種不同的方法實現。
1) 呼叫檔案流的成員函式open。如
ofstream outfile; //定義ofstream類(輸出檔案流類)物件outfile
outfile.open("f1.dat",ios::out); //使檔案流與f1.dat檔案建立關聯
第2行是呼叫輸出檔案流的成員函式open開啟磁碟檔案f1.dat,並指定它為輸出檔案, 檔案流物件outfile將向磁碟檔案f1.dat輸xhqkiiea出資料。ios::out是i/o模式的一種,表示以輸出方式開啟乙個檔案。或者簡單地說,此時f1.dat是乙個輸出檔案,接收從記憶體輸出的資料。
呼叫成員函式open的一般形式為:
檔案流物件.open(磁碟檔名, 輸入輸出方式);
磁碟檔名可以包括路徑,如"c:\new\\f1.dat",如預設路徑,則預設為當前目錄下的檔案。
2) 在定義檔案流物件時指定引數
在宣告檔案流類時定義了帶引數的建構函式,其中包含了開啟磁碟檔案的功能。因此,可以在定義檔案流物件時指定引數,呼叫檔案流類的建構函式來實現開啟檔案的功能。如
ostream outfile("f1.dat",ios::out);
一般多用此形式,比較方便。作用與open函式相同。
輸入輸出方式是在ios類中定義的,它們是列舉常量,有多種選擇,見表
幾點說明:
1) 新版本的i/o類庫中不提供ios::nocreate和ios::noreplace。
2) 每乙個開啟的檔案都有乙個檔案指標,該指標的初始位置由i/o方式指定,每次讀寫都從檔案指標的當前位置開始。每讀入乙個位元組,指標就後移乙個位元組。當檔案指標移到最後,就會遇到檔案結束eof(檔案結束符也佔乙個位元組,其值為-1),此時流物件的成員函式eof的值為非0值(一般設為1),表示檔案結束了。
3) 可以用「位或」運算子「|」對輸入輸出方式進行組合,如表13.6中最後3行所示那樣。還可以舉出下面一些例子:
ios::in | ios:: noreplace //開啟乙個輸入檔案,若檔案不存在則返回開啟失敗的資訊
ios::app | ios::nocreate //開啟乙個輸出檔案,在檔案尾接著寫資料,若檔案不存在,則返回開啟失敗的資訊
ios::out l ios::noreplace //開啟乙個新檔案作為輸出檔案,如果檔案已存在則返回開啟失敗的資訊
ios::in l ios::out i ios::binary //開啟乙個二進位制檔案,可讀可寫
但不能組合互相排斥的方式,如 ios::nocreate l ios::noreplace。
4) 如果開啟操作失敗,open函式的返回值為0(假),如果是用呼叫建構函式的方式開啟檔案的,則流物件的值為0。可以據此測試開啟是否成功。如
if(outfile.open("f1.bat", ios::app) ==0)
cout <
或if( !程式設計客棧outfile.open("f1.bat", ios::app) )
cout <
關閉磁碟檔案
在對已開啟的磁碟檔案的讀寫操作完成後,應關閉該檔案。關閉檔案用成員函式close。如
outfile.close( ); //將輸出檔案流所關聯的磁碟檔案關閉
所謂關閉,實際上是解除該磁碟檔案與檔案流的關聯,原來設定的工作方式也失效,這樣,就不能再通過檔案流對該檔案進行輸入或輸出。此時可以將檔案流與其他磁碟檔案建立關聯,通過檔案流對新的檔案進行輸入或輸出。如
outfile.open("f2.dat",ios::app|ios::nocreate);
此時檔案流outfile與f2.dat建立關聯,並指定了f2.dat的工作方式。
本文位址: /ruanjian/c/131682.html
C語言檔案操作相關
在程式設計師和磁碟之間有乙個檔案作業系統 適配層 在作業系統下只有兩種檔案 文字檔案 ascll檔案 二進位制檔案 記憶體儲存 檔案的三板斧 開啟 讀和寫 關閉。開啟函式fopen fopen 函式開啟由fname 檔名 指定的檔案,並返回乙個關聯該檔案的流.如果發生錯誤,fopen 返回null....
C語言相關檔案操作
1.對已知檔案進行分割。1 include 2 include 3 include 4 file in,out 5 char filename 256 ch,cfilename 256 6 void depart 7 15 unsigned long int n 1,k,byte 0 16 unsi...
解讀VC 程式設計中的檔案操作API和CFile類
handle handle win32 find data find data handle findfirstfile d vss find data findclose handle find data.dwfileattributes find data.dwfileattributes fi...