第七篇:兩個經典的檔案IO程式示例

穆晨發表於2017-01-26

前言

       本文分析兩個經典的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++教材。

相關文章