一、C++文件的基礎知識
- C++程序要處理文件,首先要包含fstream頭文件
- fstream.h提供三種流對象類型:ofstream、ifstream、fstream
- C++程序處理文件之前,必須定義流對象,通過流對象操作文件
- ofstream f1; 只輸出文件流類型
- ifstream f1; 只輸入文件流類型
- fstream f1; 輸入輸出文件流
二、打開和關閉文件
2.1 打開文件
- 打開文件可以通過流對象的函數成員open進行
- ofstream f1; f1.open("data.txt");
- ifstream f1; f1.open("data.txt");
- fstream f1; f1.open("data.txt", ios::out | ios::in);
- 當使用fstream對象時,open函數還需要有一個參數,這個參數就是文件的訪問標志,也稱為文件的打開模式,常用的如下
- ios::app 以追加的方式打開文件
- ios::binary 以二進制方式打開文件,缺省的方式是文本方式
- ios::in 輸入模式,從文件中讀取數據,如果文件不存在,open函數將失敗
- ios::out 輸出模式,向文件寫數據。默認情況下,如果文件已存在,文件的內容將被刷新
- 打開模式可以通過 | 符號連接使用
- 比如只能向文件的尾部寫數據,ios::out | ios::app
- 除了可以采用open函數打開文件以外,還可以在定義流對象時打開文件
- 例如,fstream f1("data.txt", ios::in | ios::out)(以讀寫模式打開文件)
- 測試文件打開是否失敗的方法是采用fail函數
- 當打開文件失敗時,fail函數成員將返回true
- 例如,if(f1.fail()) {cout<<"file open failed!\n"; exit(0);}
2.2 關閉文件
- 打開的文件使用完成后一定要關閉
- fstream提供了成員函數close()來完成此操作,如:f1.close();就把f1相連的文件關閉
三、讀寫文件
3.1 采用流操作符>>和<<讀寫文件
- 將數據寫到與流對象關聯的文件中,類似於采用cout寫到屏幕上
- cout格式化輸出數據的方法也適用於寫文件操作
- 通過操作符>>從文件中讀取數據時,是通過空白字符(空格、跳格、換行)進行區分數據的
- 可以通過函數成員eof()檢測“讀指針”是否已經到達文件的尾部(文件最后一個數據的后面),若是,則eof函數返回true
- 例如,while(! f1.eof()) f1>>var;
3.2 采用函數成員讀寫文件
- 流對象的函數成員getline,一次讀取文件中的一行字符,包含空白字符,例如:f1.getline(str, 81, '\n')
- str是一個字符數組名,從文件中讀取的數據將存儲在str中
- 81表示從文件中最多能讀取80個字符
- '\n'是界符,如果在讀滿最大字符個數之前遇到了界符,那么將停止讀取,這個參數可選,如省略則默認為'\n'
- 上述例子,如果讀滿了80個字符或是遇到了'\n'符號,都將停止讀取,最后將讀取到的字符串存到str中
- 流對象的函數成員get,從文件中一次讀取一個字符,例如:f1.get(ch)
- ch是一個字符變量,從文件中讀取的字符存儲在ch中
- get函數能讀取任何一個字符,包括空白字符
- 流對象的函數成員put,向文件寫字符,例如:f1.put(ch)
- ch是一個字符變量,將ch的內容寫到f1關聯的文件中
- put函數能寫任何一個字符,包括空白字符
3.3 二進制文件的操作(上述全是文本文件)
- 創建二進制文件首先要以二進制方式打開文件,默認情況下,文件是以文本模式打開
- 創建二進制文件的第二步是采用write函數成員寫數據
- write函數特別適合一次寫一個數據塊(如數組、結構體或對象)
- 例如:f1.write((char *)buffer, sizeof(buffer));
- write第一個參數是內存區的開始地址,要求是char*指針,所以大多數時候需要類型轉換
- write第二個參數是以字節為單位的數據項大小
- read函數可以從文件中按二進制方式讀取數據
- 例如:f1.read((char *)buffer, sizeof(buffer));
- read函數和write函數的參數含義相同