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