C++文件操作專題

C++把文件看成無結構的字節流,文件中只存儲了數據,沒有存儲記錄的邏輯結構,編碼方式分爲文本文件(順序存取)和二進制文件(隨機存取)。
存取方式分爲順序文件和隨機文件(有一部分指針和函數可以實現跳躍式的讀取和存儲)。

要執行文件的輸入輸出,須做以下幾件事:

(1) 在程序中包含頭文件fstream;

(2) 建立文件流。

建立文件流的過程就是定義流類的對象,例如:
ifstream in;
ofstream out;
fstream both;
分別定義了輸入流對象in;輸出流對象out,輸入輸出流對象both。

(3) 使用open()函數打開文件,也就是使某一文件與上面的某一流相聯繫。

open()函數是上述三個流類的成員函數,其原型是在fstream.h中定義的, 原型爲:
void open(const unsigned char*,int mode,int access=filebuf::openprot);

第一個參數用於傳遞文件名;

第二個參數mode值表示文件的使用方式;

第三個參數打開文件的共享方式

具體的值在使用時查找即可

(4) 對open結果進行檢查

(檢查打開操作是否成功。可省略,但不推薦。)

(5)進行讀寫。

在建立(或打開)的文件上執行所要求的輸入或輸出操作;

(6)關閉文件流對象。

實際使用

讀取文件

重載>>運算符

istream& operator>>(istream& in, Book& book)
{
	string* temp = const_cast<string*>(&book.ISBN);
	string input;
	in >> input;
	*temp = input;
	in >> book.bname >> book.writer >> book.publisher >> book.publishdate >> book.btype;
	return in;
}

load函數,使數據從文件中讀取到內存,並做一些初始化的操作

void Operation::loadBook()
{
	Book a;

	ifstream in("E:\\inbook.txt");
	if (!in)
		return;
	while (!in.eof())
	{
		in >> a;
		int temp1, temp2;
		in >> temp1 >> temp2;
		a.setTotal(temp1);
		a.setNum(temp2);
		book.push_back(a);
		bookname.insert(make_pair(a.getBname(), book.size() - 1));
		bookid.insert(make_pair(a.getIsbn(), book.size() - 1));
	}
	in.close();
}

寫入操作

重載<<運算符

ostream& operator<<(ostream& out, Book& book)
{
	out << book.ISBN << " " << book.bname << " " << book.writer << " " << book.publisher << " " << book.publishdate << " " << book.btype << " " << book.total << " " << book.num << endl;
	return out;
}

將處理後的數據從內存寫入文件(遍歷),做持久化處理

void Operation::saveBook()
{
	ofstream out("E:\\outbook.txt");
	vector<Book>::iterator it;
	for (it = book.begin(); it != book.end(); it++)
	{
		out << *it;
	}
	out.close();
}

關於文件操作的系統開發思路

一般的系統都是需要文件存盤的,文件起到的作用就是持久化,程序運行後內存不會保存,那麼也就需要將處理後的數據儲存到磁盤中,也就是所謂的持久化處理。
關於這類的系統開發,主要是這樣的思路:
從文件中讀取初始數據到內存(往往是數組啊,鏈表啊之類的)->在內存中對數組鏈表進行處理->處理過後將處理後的結果遍歷一遍,保存到文件中。
而第一步讀取數據到內存中往往放到構造函數內部,也就是在初始化對象的同時也就進行了讀文件的操作;最後一步存盤操作往往放到析構函數內部,也就是在對象調用結束的時候自動執行存盤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章