到目前為止,我們一直在使用 iostream 標準庫,它提供了 cin 及 cout方法,分別用于讀取標準輸入以及寫入標準輸出。
本教程將教你如何從文件中讀取和寫入。這需要另一個稱為 fstream 的標準 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++ 源文件里面。
需要對一個文件進行讀寫操作時必須先打開該文件。 ofstream 或 fstream 對象可以用來打開一個文件并且寫入; ifstream 對象用于以讀入打開一個文件。
下面是 open()
函數(shù)的標準語法,它是 fstream,ifstream,ofstream 對象的成員。
void open(const char *filename, ios::openmode mode) ;
在這里,第一個參數(shù)指定文件的名稱和打開位置,open()成員函數(shù)的第二個參數(shù)定義了文件應(yīng)該以哪種模式被打開。
模式標志 | 描述 |
---|---|
ios::app | 追加模式。所有輸出文件附加到結(jié)尾。 |
ios::ate | 為輸出打開一個文件并將讀/寫控制移動到文件的末尾。 |
ios::in | 打開一個文件去讀。 |
ios::out | 打開一個文件去寫。 |
ios::trunc | 如果文件已經(jīng)存在,打開該文件前文件中的內(nèi)容將被清空。 。 |
您可以通過邏輯運算將兩個或更多的這些值組合到一起。例如, 如果你想以寫方式打開一個文件, 并且想在其打開之前清空內(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 );
一個 C++ 程序終止時它會自動關(guān)閉所有流,釋放所有分配的內(nèi)存并關(guān)閉所有打開的文件。但在終止之前,程序員應(yīng)該關(guān)閉所有打開的程序文件始終是一個很好的實習(xí)慣。
下面是標準的 close()
函數(shù)語法,它是一個 fstream,ifstream,以及 ofstream對象的成員。
void close();
在使用 C++ 編程時,你通過程序使用流插入操作符(< <)
將信息寫入文件,使用流插入操作符(< <)
就像你使用鍵盤輸入將信息輸出到屏幕上。唯一的區(qū)別是, 你使用一個 ofstream 或 fstream 對象而不是 cout。
您使用留提取符 (>>
) 將文件中的信息讀入程序就像你使用該運營商從鍵盤輸入信息。唯一的區(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;
}
當上面的代碼被編譯并執(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
(默認)定位相對于流的開始, io: :scur
定位相對于當前位置的流或 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 );