天天看點

使用fstream讀寫檔案

下面通過一個例子來說明如何使用:

#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模式同時打開的,不會清空檔案的内容。

有一點必須要注意,“模式”是檔案的屬性而不是流的屬性,這意味每次打開一個檔案時,都要指定它的打開模式(顯式或者隐式)。