前言
本文分析兩個經典的C++檔案IO程式,提煉出其中檔案IO的基本套路,留待日後查閱。
程式功能
程式一列印使用者指定的所有文字檔案,程式二向使用者指定的所有文字檔案中寫入資料。
程式一程式碼及其註釋
1 #include <iostream> 2 #include <fstream> // 使用檔案處理物件記著要包含這個標頭檔案 3 #include <string> 4 #include <vector> 5 6 using namespace std; 7 8 int main() 9 { 10 /* 11 * 獲取使用者需要開啟的所有檔名,將其儲存在順序容器files中。 12 */ 13 string filename; 14 vector<string> files; 15 cout << "請輸入要處理的文字檔名( ctrl+d結束 ):" << endl; 16 while (cin >> filename) { 17 files.push_back(filename); 18 cout << "請輸入要處理的文字檔名( ctrl+d結束 ):" << endl; 19 } 20 cout << endl << "檔名錄入完畢..." << endl << endl; 21 22 /* 23 * 遍歷檔名,並輸出各個檔案。 24 */ 25 // 建立一個流物件 26 fstream io; 27 for (vector<string>::iterator it = files.begin(); it != files.end(); it++) { 28 // 開啟檔案 29 io.open(it->c_str()); 30 // 開啟檔案失敗的異常處理 31 if (!io) { 32 cout << "檔案 " << it->c_str() << " 開啟失敗!" << endl; 33 continue; 34 } 35 /* 36 * 列印檔案內容 37 */ 38 cout << "檔案: " << it->c_str() << endl; 39 string s; 40 while (getline(io, s)) 41 cout << s << endl; 42 cout << endl << "檔案" << it->c_str() << "讀取完畢" << endl << endl << endl; 43 // 重置流前要先關閉流 44 io.close(); 45 // 重置流 46 io.clear(); 47 } 48 49 // 使用完流關閉流。 50 io.close(); 51 52 return 0; 53 }
自行上機體驗,不在此執行演示。
程式二程式碼及其註釋
1 #include <iostream> 2 #include <fstream> // 使用檔案處理物件記著要包含這個標頭檔案 3 #include <string> 4 #include <vector> 5 6 using namespace std; 7 8 int main() 9 { 10 /* 11 * 獲取使用者需要開啟的所有檔名,將其儲存在順序容器files中。 12 */ 13 string filename; 14 vector<string> files; 15 cout << "請輸入要處理的文字檔名( #結束 ):" << endl; 16 while (cin >> filename) { 17 if (filename=="#") break; 18 files.push_back(filename); 19 cout << "請輸入要處理的文字檔名( #結束 ):" << endl; 20 } 21 // 清空輸入緩衝區 22 cin.ignore(1024, '\n'); 23 cout << endl << "檔名錄入完畢..." << endl << endl; 24 25 /* 26 * 遍歷檔名,並依次往檔案中寫入資料。 27 */ 28 fstream io; 29 for (vector<string>::iterator it = files.begin(); it != files.end(); it++) { 30 // 開啟檔案 31 io.open(it->c_str()); 32 // 開啟檔案失敗的異常處理 33 if (!io) { 34 cout << "檔案 " << it->c_str() << " 開啟失敗!" << endl; 35 continue; 36 } 37 /* 38 * 往檔案寫入資料 39 */ 40 cout << "檔案: " << it->c_str() << "( 單行輸入#結束寫入 )" << endl; 41 string s; 42 while (getline(cin, s)) { 43 if (s == "#") break; 44 io << s << endl; 45 } 46 cout << endl << "檔案" << it->c_str() << "寫入完畢" << endl << endl << endl; 47 // 重置流前要先關閉流 48 io.close(); 49 // 重置流 50 io.clear(); 51 } 52 53 // 使用完流關閉流 54 io.close(); 55 56 return 0; 57 }
自行上機體驗,不在此執行演示。
說明
1. 我之所以選用的例子是處理多個檔案而不是單個檔案,是想在程式碼中體現出用單個流物件處理多個檔案的技巧。
2. 檔案IO操作還有許多功能,諸如控制開啟模式,獲得流狀態等等。詳情參考各C++教材。