文件和流

2018-08-12 22:03 更新

文件和流

到目前為止,我們一直在使用 iostream 標(biāo)準(zhǔn)庫,它提供了 cin 及 cout方法,分別用于讀取標(biāo)準(zhǔn)輸入以及寫入標(biāo)準(zhǔn)輸出。

本教程將教你如何從文件中讀取和寫入。這需要另一個稱為 fstream 的標(biāo)準(zhǔn) C++ 庫,它定義了三個新的數(shù)據(jù)類型:

數(shù)據(jù)類型 描述
ofstream 這個數(shù)據(jù)類型表示輸出文件流,用于創(chuàng)建文件以及將信息寫入文件。
ifstream 這個數(shù)據(jù)類型表示輸入文件流,用于從文件讀取信息。
fstream 這個數(shù)據(jù)類型通常表示該文件流,兼?zhèn)溆?ofstream 和 ifstream 功能,這意味著它可以創(chuàng)建文件,編寫文件,以及讀文件。

使用 C++ 執(zhí)行文件處理時,頭文件<iostream><fstream>必須包含在你的 C++ 源文件里面。

打開文件

需要對一個文件進(jìn)行讀寫操作時必須先打開該文件。 ofstream 或 fstream 對象可以用來打開一個文件并且寫入; ifstream 對象用于以讀入打開一個文件。

下面是 open()函數(shù)的標(biāo)準(zhǔn)語法,它是 fstream,ifstream,ofstream 對象的成員。

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

在這里,第一個參數(shù)指定文件的名稱和打開位置,open()成員函數(shù)的第二個參數(shù)定義了文件應(yīng)該以哪種模式被打開。

模式標(biāo)志 描述
ios::app 追加模式。所有輸出文件附加到結(jié)尾。
ios::ate 為輸出打開一個文件并將讀/寫控制移動到文件的末尾。
ios::in 打開一個文件去讀。
ios::out 打開一個文件去寫。
ios::trunc 如果文件已經(jīng)存在,打開該文件前文件中的內(nèi)容將被清空。 。

您可以通過邏輯運(yùn)算將兩個或更多的這些值組合到一起。例如, 如果你想以寫方式打開一個文件, 并且想在其打開之前清空內(nèi)容,以防它已經(jīng)存在的話,使用一下語法規(guī)則:

    ofstream outfile;
    outfile.open("file.dat", ios::out | ios::trunc );

同樣,你可以以讀入和寫入目的打開一個文件如下:

    fstream  afile;
    afile.open("file.dat", ios::out | ios::in );

關(guān)閉文件

一個 C++ 程序終止時它會自動關(guān)閉所有流,釋放所有分配的內(nèi)存并關(guān)閉所有打開的文件。但在終止之前,程序員應(yīng)該關(guān)閉所有打開的程序文件始終是一個很好的實(shí)習(xí)慣。

下面是標(biāo)準(zhǔn)的 close() 函數(shù)語法,它是一個 fstream,ifstream,以及 ofstream對象的成員。

    void close();

寫文件

在使用 C++ 編程時,你通過程序使用流插入操作符(< <)將信息寫入文件,使用流插入操作符(< <)就像你使用鍵盤輸入將信息輸出到屏幕上。唯一的區(qū)別是, 你使用一個 ofstream 或 fstream 對象而不是 cout。

讀文件

您使用留提取符 (>>) 將文件中的信息讀入程序就像你使用該運(yùn)營商從鍵盤輸入信息。唯一的區(qū)別是,你使用一個 ifstream 或 fstream 對象而不是 cin 的對象。

讀取與寫入樣例

下面是一段 C++ 程序,以讀取和寫入方式打開一個文件。將用戶輸入的信息寫入文件后以 afile.dat 命名文件。程序從文件中讀取信息并輸出在屏幕上:

    #include <fstream>
    #include <iostream>
    using namespace std;

    int main ()
    {

       char data[100];

       // open a file in write mode.
       ofstream outfile;
       outfile.open("afile.dat");

       cout << "Writing to the file" << endl;
       cout << "Enter your name: "; 
       cin.getline(data, 100);

       // write inputted data into the file.
       outfile << data << endl;

       cout << "Enter your age: "; 
       cin >> data;
       cin.ignore();

       // again write inputted data into the file.
       outfile << data << endl;

       // close the opened file.
       outfile.close();

       // open a file in read mode.
       ifstream infile; 
       infile.open("afile.dat"); 

       cout << "Reading from the file" << endl; 
       infile >> data; 

       // write the data at the screen.
       cout << data << endl;

       // again read the data from the file and display it.
       infile >> data; 
       cout << data << endl; 

       // close the opened file.
       infile.close();

       return 0;
    }

當(dāng)上面的代碼被編譯并執(zhí)行,將產(chǎn)生如下的樣本和輸出:

    $./a.out
    Writing to the file
    Enter your name: Zara
    Enter your age: 9
    Reading from the file
    Zara
    9

上面的例子利用 cin 對象額外的功能,如利用 getline()函數(shù)來從外部讀取線,用 ignor()函數(shù)忽略先前讀取語句留下的額外字符。

文件位置指針

istream 和 ostream 是用來重新定位文件位置的指針成員函數(shù)。這些成員函數(shù)有 seekg (“seek get”) istream 和 seekp 上 ostream (“seek put”)。

seekg 和 seekp 通常的參數(shù)是一個長整型??梢灾付ǖ诙€參數(shù)為尋找方向。尋找方向可以 ios: :beg (默認(rèn))定位相對于流的開始, io: :scur 定位相對于當(dāng)前位置的流或 ios::end 定位相對于流的結(jié)束。

文件位置指針是一個整數(shù)值,它指定文件的位置作為一個從文件的開始位置的字節(jié)數(shù)。

文件位置指針是一個整數(shù)值,它指定文件的位置。定位 “get” 文件位置指針的一些示例如下:

    // position to the nth byte of fileObject (assumes ios::beg)
    fileObject.seekg( n );

    // position n bytes forward in fileObject
    fileObject.seekg( n, ios::cur );

    // position n bytes back from end of fileObject
    fileObject.seekg( n, ios::end );

    // position at end of fileObject
    fileObject.seekg( 0, ios::end );
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號