文件輸入輸出
文件寫入:
-
准備:
- 包含 fstream 。
- fstream 定義了 ofstream 類。
- 指明 std 。
- ofstream 對象使用 open() 、 close() 。
-
注意:
- 寫入各種數據:ofsteam對象 <<
#include<fstream> using namespace::std; ofsteam fout; fout.open(c_str); fout << data; fout.close();
注:向文件輸入字符串時會同時輸入結尾的空字符。
-
- 所有可用於 cout 的操作和方法都可用於 ofstream 對象。
- 如果文件不存在則新建,否則重建。
文件讀入:
-
准備:
- 包含 fstream 。
- fsteam 定義了 ifstream 類。
- 指明 std 。
- ifstream 對象使用 open() 、 close() 。
-
注意:
- 讀取各種數據:ifsteam 對象 >>
#include<fstream> using namespace::std; ifsteam fin; fin.open(c_str); fin >> ch; fin.close();
- 所有可用於 cin 的操作和方法都可用於 ifstream 對象。
- ifsteam 對象本身被用作測試條件時,如果最后一個讀取操作成功,它將被轉換為布爾值 true ,否則被轉換為 false 。
- 如果文件不存在則文件打開失敗。
- 讀取各種數據:ifsteam 對象 >>
檢查文件是否成功打開:
- 通常,除非在輸入的文件名中包含路徑,否則程序將在可執行文件所屬的文件夾中查找(或者在相關的路徑)。
- ifstream對象.is_open() 、 ofsteam對象.is_open() 。返回 true 、 false 。
inFile.open(str); if (!inFile.is_open()) { exit(EXIT_FAILURE); }
注:exit() 的原型在cstdlib 中定義,該頭文件還定義了 EXIT_FAILURE 。
檢查數據讀入是否成功:
- 程序讀取文件時不應超過 EOF 。
- 幾個方法:
- eof () :如果最后一次讀取數據時遇到 EOF ,方法 eof () 將返回 true 。
- fail () :如果最后一次讀取操作中發生了類型不匹配的情況,方法 fail () 將返回 true (如果遇到了 EOF ,該方法也將返回 true )。
- bad () :可能出現意外的問題,如文件受損或硬件故障。如果最后一次讀取文件時發生了這樣的問題,方法 bad () 將返回 true。
- good () :該方法在沒有發生任何錯誤時返回 true 。
- 程序中使用 good () 方法,然后,如果願意,可以使用其它方法來確定循環終止的真正原因。
while (inFile.good()) //while input good and not at EOF { ... }
if (inFile.eof()) cout << "End of file reached.\n"; else if (inFile.fail () ) cout << "Input terminated by data mismatch.\n"; else cout << "Input terminated for unknown reason.\n";
- 方法 good () 指出最后一次讀取輸入的操作是否成功,這意味着應該在執行讀取輸入的操作后,立刻應用這種測試。一種標准方法是,在循環之前(首次執行循環測試前)放置一條輸入語句,並在循環的末尾(下次執行循環測試之前)放置另一條輸入語句:
// standard file-reading loop design inFile >> value; // get first value while (inFile.good()) { // loop body goes here inFile >> value; // get next value }
鑒於表達式 inFle >> value 的結果為 inFile ,而在需要一個 bool 值的情況下, inFile 的結果為 inFile.good() ,即 true 或 false ,代碼可精簡如下:
// abbreviated file-reading loop design // omit pre-loop input while (inFile << value) // read and test for success { // loop body goes here // omit end-of-loop input }
注意:
- Windows 文本文件的每行都以回車字符和換行符結尾;通常情況下,C++ 在讀取文件時將這兩個字符轉換為換行符,並在寫入文件時執行相反的轉換。
- 控制台輸入的文件版本是文本文件,即每個字節都存儲了一個字符編碼的文件。並非所有的文件都是文本文件,例如,數據庫和電子表格以數值格式(即二進制整數或浮點格式)來存儲數值數據。另外,字處理文件中可能包含文本信息,但也可能包含用於描述格式、字體、打印機等的非文本數據。
- 以上討論的文件 I/O 相當於控制台 I/O ,因此僅適用於文本文件。