C 關於檔案流才操作

2021-04-25 00:08:51 字數 3974 閱讀 8201

ofstream: 寫操作(輸出)的檔案類 (由ostream引申而來)

ifstream: 讀操作(輸入)的檔案類 (由istream引申而來)

fstream: 可同時讀寫操作的檔案類 (由iostream引申而來)

所以標頭檔案一般要包含上述對應的支援庫

開啟檔案(open a file)

我們使用它的成員函式open():

void open (const char * filename, openmode mode);

ofstream, ifstream 和 fstream所有這些類的成員函式open 都包含了乙個預設開啟檔案的方式,這三個類的預設方式各不相同: 類 引數的預設方式

ofstream ios::out | ios::trunc

ifstream ios::in

fstream ios::in | ios::out

只有當函式被呼叫時沒有宣告方式引數的情況下,預設值才會被採用。如果函式被呼叫時宣告了任何引數,預設值將被完全改寫,而不會與呼叫引數組合。

兩種開啟檔案的方式都是正確的。

你可以通過呼叫成員函式is_open()來檢查乙個檔案是否已經被順利的開啟了:bool is_open();

它返回乙個布林(bool)值,為真(true)代表檔案已經被順利開啟,假( false )則相反。

關閉檔案(closing a file)

當檔案讀寫操作完成之後,我們必須將檔案關閉以使檔案重新變為可訪問的。關閉檔案需要呼叫成員函式close(),它負責將快取中的資料排放出來並關閉檔案。它的格式很簡單:void close ();

這個函式一旦被呼叫,原先的流物件(stream object)就可以被用來開啟其它的檔案了,這個檔案也就可以重新被其它的程序(process)所有訪問了。

為防止流物件被銷毀時還聯絡著開啟的檔案,析構函式(destructor)將會自動呼叫關閉函式close。

文字檔案(text mode files)

類ofstream, ifstream 和fstream 是分別從ostream, istream 和iostream 中引申而來的。這就是為什麼 fstream 的物件可以使用其父類的成員來訪問資料。

一般來說,我們將使用這些類與同控制台(console)互動同樣的成員函式(cin 和 cout)來進行輸入輸出。如下面的例題所示,我們使用過載的插入操作符<<: // writing on a text file

#include

int main ()

return 0;

}file example.txt

this is a line.

this is another line.

從檔案中讀入資料也可以用與 cin的使用同樣的方法: // reading a text file

#include

#include

#include

int main ()

while (! examplefile.eof() )

return 0;

}this is a line.

this is another line.

上面的例子讀入乙個文字檔案的內容,然後將它列印到螢幕上。注意我們使用了乙個新的成員函式叫做eof ,它是ifstream 從類 ios 中繼承過來的,當到達檔案末尾時返回true 。

狀態標誌符的驗證(verification of state flags)

除了eof()以外,還有一些驗證流的狀態的成員函式(所有都返回bool型返回值):

bad()

如果在讀寫過程中出錯,返回 true 。例如:當我們要對乙個不是開啟為寫狀態的檔案進行寫入時,或者我們要寫入的裝置沒有剩餘空間的時候。

fail()

除了與bad() 同樣的情況下會返回 true 以外,加上格式錯誤時也返回true ,例如當想要讀入乙個整數,而獲得了乙個字母的時候。

eof()

如果讀檔案到達檔案末尾,返回true。

good()

這是最通用的:如果呼叫以上任何乙個函式返回true 的話,此函式返回 false 。

要想重置以上成員函式所檢查的狀態標誌,你可以使用成員函式clear(),沒有引數。

獲得和設定流指標(get and put stream pointers)

所有輸入/輸出流物件(i/o streams objects)都有至少乙個流指標:

ifstream, 類似istream, 有乙個被稱為get pointer的指標,指向下乙個將被讀取的元素。

ofstream, 類似 ostream, 有乙個指標 put pointer ,指向寫入下乙個元素的位置。

fstream, 類似 iostream, 同時繼承了get 和 put

我們可以通過使用以下成員函式來讀出或配置這些指向流中讀寫位置的流指標:

tellg() 和 tellp()

這兩個成員函式不用傳入引數,返回pos_type 型別的值(根據ansi-c++ 標準) ,就是乙個整數,代表當前get 流指標的位置 (用tellg) 或 put 流指標的位置(用tellp).

seekg() 和seekp()

這對函式分別用來改變流指標get 和put的位置。兩個函式都被過載為兩種不同的原型:

seekg ( pos_type position );

seekp ( pos_type position );

使用這個原型,流指標被改變為指向從檔案開始計算的乙個絕對位置。要求傳入的引數型別與函式 tellg 和tellp 的返回值型別相同。

seekg ( off_type offset, seekdir direction );

seekp ( off_type offset, seekdir direction );

使用這個原型可以指定由引數direction決定的乙個具體的指標開始計算的乙個位移(offset)。它可以是: ios::beg 從流開始位置計算的位移

ios::cur 從流指標當前位置開始計算的位移

ios::end 從流末尾處開始計算的位移

流指標 get 和 put 的值對文字檔案(text file)和二進位制檔案(binary file)的計算方法都是不同的,因為文字模式的檔案中某些特殊字元可能被修改。由於這個原因,建議對以文字檔案模式開啟的檔案總是使用seekg 和 seekp的第一種原型,而且不要對tellg 或 tellp 的返回值進行修改。對二進位制檔案,你可以任意使用這些函式,應該不會有任何意外的行為產生。

以下例子使用這些函式來獲得乙個二進位制檔案的大小: // obtaining file size

#include

#include

const char * filename = "example.txt";

int main ()

size of example.txt is 40 bytes.

二進位制檔案(binary files)

在二進位制檔案中,使用<< 和》,以及函式(如getline)來操作符輸入和輸出資料,沒有什麼實際意義,雖然它們是符合語法的。

檔案流包括兩個為順序讀寫資料特殊設計的成員函式:write 和 read。第乙個函式 (write) 是ostream 的乙個成員函式,都是被ofstream所繼承。而read 是istream 的乙個成員函式,被ifstream 所繼承。類 fstream 的物件同時擁有這兩個函式。它們的原型是:

write ( char * buffer, streamsize size );

read ( char * buffer, streamsize size );

這裡 buffer 是一塊記憶體的位址,用來儲存或讀出資料。引數size 是乙個整數值,表示要從快取(buffer)中讀出或寫入的字元數。 // reading binary file

#include

#include

const char * filename = "example.txt";

int main ()

C 檔案流操作

include stdafx.h include include include include include using namespace std void writecharsettofile const string filename void outputfile const strin...

C 檔案流操作

c 的檔案流本質是利用了乙個buffer中間層,有點類似標準輸出和標準輸入一樣。需要包含的標頭檔案 fstream.h 需要的命名空間 std fstream提供了三個類,用來實現c 對檔案的操作,以下對其做個簡要概述。1.ifstream類 2.ofstream類 3.fstream類 支援的檔案...

C 流檔案操作

c 流檔案操作 開發工具與關鍵技術 visual studio c 流檔案操作 流檔案的基本操作 1.開啟檔案 2.進行讀或者寫的操作 3.關閉檔案 計算機中各種應用系統都把一些資訊組織起來放在外部儲存器,這種組織被稱為檔案,並用檔名作為標識。c 中檔案作為無結構的位元組流 編碼方式 文字方式 二進...