下面通過一個例子來說明如何使用:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
void process(string s)
{
cout<<s;
}
int main()
{
//vecot中存放的是一系列需要打開的檔案的名字
vector<string> files;
files.push_back("a.txt");
files.push_back("b.txt");
vector<string>::iterator it = files.begin();
string s;
while(it != files.end())
{
//打開檔案
//初始化ifstream對象時,需要使用C風格的字元串
//這通過c_str()來擷取
ifstream input(it->c_str());
//判斷打開是否成功
if(!input)
{
//輸出警告資訊
cerr<<"error: can't open file:"
<<*it<<endl;
//清除流的狀态
input.clear();
//疊代器指向下一個檔案名
++it;
}
else
{
//若果成功打開,則讀取并處理檔案流input
while(input>>s)
process(s);
//處理完畢以後關閉檔案
input.close();
//清楚檔案流标志
input.clear();
//擷取下一個檔案
++it;
}
}
return 0;
}
在這個例子中,vector裡儲存的一系列的檔案名(這裡隻有2個,a.txt中的内容為aaa;b.txt中的内容為bbb)。通過周遊容器來實作讀檔案的功能。
在讀寫檔案時,必須定義自己的對象,并将對象與綁定起來。這可以通過定義時初始化完成,也可以通過open函數完成。需要注意的是,由于曆史原因,綁定對象需要使用C風格的字元串而不是string類型。是以如果你輸入的檔案名是一個string,需要調用c_str()方法來或得對應的字元串。
打開檔案後,最好檢測檔案打開是否成功,這通過if(!input)來完成。如果代開失敗,發出警告并清理流的狀态是他可以讀下一個檔案;否則從檔案中讀取檔案的内容進行處理。這裡的處理很簡單,就是顯示檔案内容而已。
有一點需要注意,一旦fstream對象打開,則會一直與檔案捆綁,如果要用這個對象打開另一個檔案,則必須先關閉已綁定的檔案。但是關閉流不能改變流對象的狀态,是以如果上一次對檔案的讀寫操作失敗(或者檔案結束),則流對象一直處于不正确的模式,不能繼續使用。是以最好在關閉流以後再清除流的狀态。
最終螢幕上會顯示aaabbb。
還要注意的是,打開檔案時需要指定檔案模式,在預設狀态下,ifstream以in模式打開;ofstream以out模式打開。
對于用ostream打開的檔案如果要想打開檔案并儲存裡面的資料,隻能以app模式打開。
通常我們希望對一個檔案一邊寫入,一邊讀出。這可使用fstream流,預設情況下,這個流是以in和out模式同時打開的,不會清空檔案的内容。
有一點必須要注意,“模式”是檔案的屬性而不是流的屬性,這意味每次打開一個檔案時,都要指定它的打開模式(顯式或者隐式)。