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