位置:首頁 > 高級語言 > C++教學 > C++文件和流

C++文件和流

到目前為止,我們已經使用了iostream標準庫,它提供cin和cout方法,分彆從標準輸入讀取和寫入標準輸出。

本教學演示如何讀取和寫入文件。這就需要另一個標準C++庫稱為fstream,它定義了三個新的數據類型:

數據類型 描述
ofstream 此數據類型表示輸出文件流,並用於創建文件和將信息寫入到文件中
ifstream 此數據類型表示輸入文件流,並用於從文件中讀取信息
fstream 這個數據類型表示文件流一般,且有兩個:ofstream和ifstream,這意味著它可以創建文件,將信息寫入到文件,並從文件中讀出信息的功能

要執行C++文件處理,頭文件<iostream的>和<fstream>必須包含在C++源代碼文件。

打開文件:

文件必須打開,然後才能從中讀取或寫入。無論是ofstream或fstream對象可以用來打開一個文件進行寫操作,如果流對象是用來打開文件為隻讀的目的。

下麵是open()函數,這是fstream,ifstream,和ofstream對象成員的標準語法。

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

這裡,open()成員函數的第一參數指定的名稱和要打開的文件的位置,第二個參數定義文件被打開的模式。

模式標誌 描述
ios::app 追加模式,所有輸出到該文件被追加到末尾
ios::ate 打開用於輸出的文件並移動讀/寫控製,以該文件的末尾
ios::in 讀取打開的一個文件
ios::out 寫入打開的一個文件
ios::trunc 如果該文件已經存在,其內容將在打開文件之前被截斷

可以通過使用它們結合兩種或兩種以上的值。例如,想以寫模式打開的文件,並想截斷它的情況下,如果它已經存在,下麵將是語法:

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

類似的方式,可以打開一個文件進行讀,寫的目的如下:

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

關閉文件

當C++程序終止,它會自動關閉刷新所有流,釋放所有分配的內存,並關閉所有打開的文件。但程序員應該在程序終止前關閉所有打開的文件,這是一個很好的做法。

以下是close()函數,這是fstream,ifstream,和ofstream對象成員的標準語法。

void close();

寫入文件:

雖然這樣做在C++編程中,從程序中使用的流插入操作信息寫入到文件(<<)就像使用操作員輸出信息到屏幕上。唯一的區彆是,使用的是ofstream或fstream對象,而不是 cout 對象。

讀取一個文件:

從文件中讀取到的信息通過流提取運算符(>>),就像程序使用操作符從鍵盤輸入信息。唯一的區彆是使用ifstreamor 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;
}

當上麵的代碼被編譯和執行,它產生下麵的示例輸入和輸出:

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

上麵的例子中使用附加功能函數,從cin對象中,如:getline()函數從外部讀取一行並且ignore() 函數忽略由之前讀的語句留下多餘的字符。

文件位置指針:

無論istream和ostream的成員提供函數重新定位文件位置指針。這些成員函數是istream的fseek ("seek set") 和ostream的seekp ("seek put")。

該參數seekg和seekp通常是一個長整型。第二個參數可以指定指示尋求方向。尋道方向可以是 ios::beg(缺省值)為相對於流的開頭定位,ios::cur以便相對於在一個數據流或當前位置的定位ios::end 到一個末端流。

文件位置指針是一個整數值,指定文件作為數字從文件的起始位置的字節位置。定位在“得到”文件位置指針的一些例子:

// 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 );