C++檔案處理

來源:互聯網
上載者:User

一、 檔案和流

每個檔案不是以檔案結束符結束,就是以在由系統維護和管理的資料結構中特定的位元組號處結束。檔案開啟時,就會建立一個對象,將這個對象和某個流關聯起來。
Cin,cout,cerr,clog這4個對象會自動產生。與這些對象相關聯的流提供者與特定檔案或裝置之間的通訊通道。

 

二、 檔案處理包括標頭檔

<iostream.h>----------<fstream.h>

 

三、 建立順序訪問檔案

建立了流類ifstream(讀入),ofstream(輸出),fstream(讀入/輸出)對象後,便開啟了檔案。
對於ofstream對象,檔案開啟檔案可以是ios::out(將資料輸出到檔案)或ios::app(將資料添加到檔案末尾,不修改檔案中現有的資料),現有的檔案用ios::out開啟時會被截掉,即檔案中的所有資料均被刪除。如果指定檔案不存在,就用該檔案名稱建立它。
例:ofstream outClientFile( “clients.dat”, ios::out );
開啟了檔案的ofstream建構函式,這樣就建立了與檔案的通訊。

檔案開啟檔案一覽:

ios::app  將所有的輸出寫入檔案的末尾
ios::ate  開啟檔案以便輸出,並移動檔案末尾(通常用語在檔案中添加資料)。資料可以寫入檔案的任何地方
ios::in  開啟檔案以便輸入
ios::out  開啟檔案以便輸出
ios::trunc 刪除檔案現有內容(這也是ios::out的預設操作)
ios::binary 開啟檔案以二進位(也就是非文本)格式輸入或輸出exit函數終止程式時,參數為0表示程式正常終止,其他任何值表示程式因某個錯誤而終止。

 

四、 讀取順序訪問檔案中的資料

例如:

ifstream inClientFile( “Clients.dat”, ios::in );<br />while( inClientFile >> account >> name >> balance );

ifstream類和ostream類都提供成員函數,使程式重新置放“檔案位置指標”,這些成員是ifstream類的seekg和ostream類的seekp,每個istream對象有一個get指標,表示檔案中一下個輸入相同的位元組數,每個ostream對象有一個put指標,表示下有一個輸出相同的位元組數。
   例:  inClientFile.seekg( 0 );將檔案位置指標移動到檔案開頭,seekg的參數通常為long類型的整數。Seekg還有第2個參數,可以指定尋找方向,ios::beg(預設)相對於流的開頭定位,ios::cur相對於流的當前位置定位,ios::end相對於流結尾定位。檔案位置指標是個整數值,指定檔案中離檔案開頭的相對位置(位移量)。
例如:

fileObject.seekg( n );//指向檔案開頭的第N個位元組。<br />fileObject.seekg( n, ios::cur );<br />fileObject.seekg( y, ios::end );<br />fileObject.seekg( 0, ios::cur );<br />Location = fileObject.tellg();// 擷取流長度  

 

五、 更新順序訪問檔案

案例:
原記錄: 300 White 0.00
改為  : 300 Worthington 0.00
因為新記錄的長度大於原始記錄的長度,所以從‘ton’中的‘o’之後的字元將重定
為檔案中的下一條順序記錄,其原因在於:使用流插入操作符<<和流讀取操作符>>的格式化輸入/輸出模型中,域的寬度不定,所以記錄的寬度也不定。
例如:7.14  -117  2047   25482都是int類型的值,雖然他們的內部儲存占相同的位元組數,但是將他們以格式化文本列印到螢幕上或儲存在磁碟上時站用的域不一樣。因此格式化輸出/輸入模型通常不用於更新現有的記錄。

 

六、 隨機訪問檔案

產生循序檔和從順序訪問檔案搜尋特定資訊順序訪問檔案不適宜快速存取應用程式,即立即找到特定記錄的資訊。快速應用程式是用隨機訪問檔案實現,這種檔案的各個記錄可以直接快速的訪問,而不需要進行搜尋。
隨機訪問檔案中的每條記錄有相同的長度,所以能夠用記錄關鍵字的Function Compute出每條記錄相對於檔案起始點的位置 。

七、 建立隨機訪問檔案

ostream成員函數write把從記憶體中指定位置開始的固定個數的位元組輸出到指定流中。當流與檔案關聯時,資料被寫到put檔案位置指標所指的位置。Istream成員函數read把固定數目的位元組從指定流輸入到記憶體中指定地址開始的地區中。如果流與檔案關聯,則該位元組從get檔案位置指標指定的檔案地址開始輸入。
例: 將一個4位元組的整數number,不再用 outFile << number;
列印1位或11位(10位加一個符號位,各自需要1位元組的儲存空間)改用
outFile.write( reinterpret_cast< const char * >( &number ), sizeof( number));
write函數要求一個const char *類型的資料作為第一個參數,因此我們用reinterpret_cast< const char * >強制類型轉換操作符將number的地址變為const char *指標。第二個參數是size_t類型的整數,指定寫入的位元組數。
隨機存取檔案處理常式很少在檔案中唯寫入一個域,通常會一次寫如一個struct或一個
class對象。
例如:

struct clientData<br />{<br />int accountNumber;<br />char lastName[ 15 ];<br />char firstName[ 10 ];<br />double balance;<br />};</p><p>int main()<br />{<br />ofstream outCredit( “credit.dat”, ios::binary );<br />if( !outCredit )<br />{<br />cerr << “File could not be opened.” << endl;<br />exit( 1 );<br />}<br />clientData blankClient = { 0, “”, “”, 0.0 };<br />for ( int I = 0; I<100, I++ )<br />{<br />outCredit.wirte(<br />reinterpret_cast< const char * ><br />( &blankClient ),sizeof( clientData ));<br />}<br />return 0;<br />}

 

八、 向隨機訪問檔案隨機寫入資料

ostream的函數seekp和write用於將資料儲存到檔案的指定位置。
OutCredit.seekp( ( client.accountNumber – 1 ) * sizeof ( ClientData ));
將對象的“put”檔案位置指標放在( client.accountNumber – 1 ) * sizeof ( ClientData )求出的位元組位置處。
Ofstream的對象outCredit用檔案開啟檔案ios::ate開啟。“put”檔案位置指標最初在檔案末尾,但資料可以在檔案任何位置寫入。

 

九、 從隨機訪問檔案中順序讀取資料

例:

inCredit.read ( reinterpret_cast< char * > ( &client ),sizeof(clientData))

例子:

int main()<br />{<br />ifstream inCredit ( “credit.dat”, iso::in );<br />if( !inCreadit )<br />{<br />cerr << “File Cannot Open” << endl;<br />exit( 1 );<br />}<br />clientData client;<br />inCredit.read( reinterpret_cast< char * >( &client ),<br />sizeof( clientData ));<br />while( inCredit && !inCredit.eof() )//當讀取錯誤或檔案末尾退出<br />{<br />if( client.accuntNumber != 0 ) outputLine( cout,<br />client );<br />inCredit.read( reinterpret_cast< char * >( &client ),<br />sizeof( clientData ));<br />}<br />return 0;<br />}<br />void outputLine( ostream &output, const clientData &c )<br />{<br />output <<……………………<<endl;<br />}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.