Cpp輸入輸出流

2021-06-29 16:27:46 字數 4930 閱讀 3741

cpp通過以下幾個類支援檔案的輸入輸出:

對這些類的乙個物件所做的第乙個操作通常就是將它和乙個真正的檔案聯絡起來,也就是說開啟乙個檔案。被開啟的檔案在程式中由乙個流物件(stream object)來表示 (這些類的乙個例項) ,而對這個流物件所做的任何輸入輸出操作實際就是對該檔案所做的操作。

要通過乙個流物件開啟乙個檔案,我們使用它的成員函式open()

void open (const char * filename, openmode mode);
這裡filename 是乙個字串,代表要開啟的檔名,mode 是以下標誌符的乙個組合:

ios::in //為輸入(讀)而開啟檔案

ios::out //為輸出(寫)而開啟檔案

ios::ate //初始位置:檔案尾

ios::trunc //如果檔案已存在則先刪除該檔案

ios::binary //二進位制方式

這些識別符號可以被組合使用,中間以「或」操作符|間隔。例如,如果我們想要以二進位制方式開啟檔案example.bin來寫入一些資料,我們可以通過以下方式呼叫成員函式open()來實現:

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

類 引數的預設方式

ofstream ios::out | ios::trunc

ifstream ios::in

fstream ios::in | ios::out

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

由於對類ofstreamifstreamfstream的物件所進行的第乙個操作通常都是開啟檔案,這些類都有乙個建構函式可以直接呼叫open函式,並擁有同樣的引數。這樣,我們就可以通過以下方式進行與上面同樣的定義物件和開啟檔案的操作:

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

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

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

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

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

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

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

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

example: writing on a text file

#include 

int main ()

return

0;}

file example.txt:

this is a line.

this is another line.

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

example: reading a text file

#include 

#include

#include

int main ()

while (! examplefile.eof())

return

0;}

console:

this is a line.

this is another line.

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

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

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

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

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

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

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

seekg(pos_type position);

seekp(pos_type position);

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

seekg(off_type offset, seekdir direction);

seekp(off_type offset, seekdir direction);

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

ios::beg //從流開始位置計算的位移

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

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

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

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

example: obtaining file size

#include 

#include

const

char * filename = "example.txt";

int main ()

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

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

write(char * buffer, streamsize size);

read(char * buffer, streamsize size);

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

example: reading binary file

#include 

#include

const

char * filename = "example.txt";

int main ()

console:

the complete file is in a buffer

cpp 輸入輸出流

刷題時輸出要求保留一位小數,在常規情況下,輸出的數字如果是整數,後面的 0 會被省略,這時可以借助輸入輸出流的控制實現 cout.setf ios fixed setprecision x cout.setf ios 引數 setiosflag ios 引數 boolalpha 可以使用單詞 tru...

cpp輸入輸出加速

std ios sync with stdio false cin,cout之所以效率低,是因為先把要輸出的東西存入緩衝區,再輸出,導致效率降低,而這段語句可以來打消iostream的輸入 輸出快取,可以節省許多時間,使效率與scanf與printf相差無幾,還有應注意的是scanf與printf使...

輸入輸出流

c 通過以下幾個類支援檔案的輸入和輸出 ofstream寫操作的檔案類由ostream引申而來 ifstream讀操作的檔案類由istream引申而來 fstream可同時讀寫操作的檔案類由iostream引申而來 ifstream in tian.txt 開啟乙個檔案 ifstream in in...