題目: 寫C++程式碼介紹一組讀檔和寫檔的指令，須能成功編譯執行。
答案: /*  類別圖：    在C++中，是透過stream的子類fstream(file stream)對檔案操作，所以要加入標頭檔<fstream.h>。  stream類別中有兩個重要的運算子：  1. 插入器<<：向流輸出資料。例如標準輸出流cout：cout <<  COUT ;就表示把字串 COUT 輸出到cout。 2. 析取器>>：從流中輸入資料。例如標準輸入流cin：cin >> x;就表示從cin中讀取一個指定型別的資料輸入到x。  因此，寫檔時，可用插入器將資料輸入到檔案。  fstream有兩個子類：ifstream(input file stream)和ofstream(outpu file stream)。  ifstream預設以輸入模式開啟檔案（從硬碟到記憶體），ofstream預設以輸出模式開啟檔案（從記憶體到硬碟）。  如果想以輸入模式開啟就用ifstream，想以輸出方式開啟就用ofstream，想以輸入/輸出方式來開啟fstream（個人偏好ifstream和ofstream，較易區分）。  ifstream和ofstream中，開啟檔案為open()，關閉檔案為close()。  1. open()：  原型：  void open (const char* filename, ios_base::openmode mode = ios_base::in); // ifstream  void open (const char* filename, ios_base::openmode mode = ios_base::out); // ofstream  filename為檔名，mode為開啟方式。  流的文件關聯由其內部流緩衝區保存： 在內部，函數調用rdbuf()->open(filename,mode)  （內部流緩衝區請參照標準函式庫：https://cplusplus.com/reference/fstream/filebuf/open/）  2. close()：  原型：void close();  關閉當前與對象關聯的文件，將其與流解除關聯。  流的文件關聯由其內部流緩衝區保存： 在內部，函數調用和設置rdbuf->close()，並設置failbit預防失敗。  （內部流緩衝區請參照標準函式庫：https://cplusplus.com/reference/fstream/filebuf/close/）  3. 有另一種方式在建構時就可開啟檔案（程式碼使用此種方式）：  建構ifstream時開啟：https://cplusplus.com/reference/fstream/ifstream/ifstream/   	 		 			default (1) 			 			ifstream(); 			 		 		 			initialization (2) 			 			explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);explicit ifstream (const string& filename, ios_base::openmode mode = ios_base::in); 			 		 		 			copy (3) 			 			ifstream (const ifstream&) = delete; 			 		 		 			move (4) 			 			ifstream (ifstream&& x); 			 		 	   建構ofstream時開啟：https://cplusplus.com/reference/fstream/ofstream/ofstream/   	 		 			default (1) 			 			ofstream(); 			 		 		 			initialization (2) 			 			explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);explicit ofstream (const string& filename, ios_base::openmode mode = ios_base::out); 			 		 		 			copy (3) 			 			ofstream (const ofstream&) = delete; 			 		 		 			move (4) 			 			ofstream (ofstream&& x); 			 		 	   補充個在stackoverflow看到的，別人的問題：https://stackoverflow.com/questions/3847611/c-stdifstream-in-constructor-problem  4. 由於open內使用字串常數，因此我使用c_str()將string轉換成AnsiString。  原型：const char* c_str() const; c_str() 會把字串物件轉換成字串常數，由於轉換後變成常數，因此不能任意更改。若必須更改字串常數，應先將其儲存到buffer再更改。  */  #include <iostream>  #include <fstream>  #include <vector>  using namespace std;  int main() {      /*      原本有個叫ABC.txt的檔案有三行內容      我先讀進來存到vector      再新建一個複製檔，寫入舊資料，並新增三行內容      註：此程式碼檔案必須與ABC.txt放在同一資料夾      產生的複製檔也會在此資料夾內      */      // 變數宣告      vector<string> vec ; // 存檔案的每一行      string nameStr =  ABC.txt ; // 檔案名稱，見附件      string toStoreStr =   ; // 暫存檔案的每一行      // ifstream：讀檔      ifstream toOpen(nameStr.c_str()); // 以讀取模式開啟檔案 // 【讀檔】      while (getline(toOpen, toStoreStr)) vec.push_back(toStoreStr); // 逐行寫入vector      toOpen.close(); // 以讀取模式關閉檔案      cout <<  Original file's data :  << endl;      for (int i = 0; i < vec.size(); i++) cout << vec[i] << endl; // 印出檔案的每一行      // ofstream：寫檔      nameStr =  copy  + nameStr;      ofstream copyFile(nameStr.c_str()); // 建立一個新的複製檔並以寫入模式開啟複製檔      for (int i = 0; i < vec.size(); i++) copyFile << vec[i] << endl; // 複製舊檔資料到複製檔      vec.erase(vec.begin(), vec.end()); // 清空重置vector      for (int i = 0; i < 3; i++) vec.push_back( write : line   + to_string(i+4)); // 存在vector內的新資料      for (int i = 0; i < vec.size(); i++) copyFile << vec[i] << endl; // 使用插入器寫入新資料 // 【寫檔】      copyFile.close(); // 以寫入模式關閉複製檔      // 印出修改後的內容      vec.erase(vec.begin(), vec.end()); // 清空重置vector      toStoreStr =   ; // 清空重置暫存字串      ifstream openCopyFile(nameStr.c_str()); // 以讀取模式開啟複製檔      while (getline(openCopyFile, toStoreStr)) vec.push_back(toStoreStr); // 逐行寫入vector      cout <<  Copyed and altered file's data :  << endl;      for (int i = 0; i < vec.size(); i++) cout << vec[i] << endl; // 印出檔案的每一行      openCopyFile.close(); // 以讀取模式關閉複製檔      /*      執行結果：      (1)印出以下內容      Original file's data :      read : line 1      read : line 2      read : line 3      Copyed and altered file's data :      read : line 1      read : line 2      read : line 3      write : line 4      write : line 5      write : line 6      (2)產生總計六行資料的複製檔copyABC.txt      */  } // main()
評論: 問題的重點是 介紹一組讀檔和寫檔的指令   請明確指出哪幾個是讀檔和寫檔的指令，並介紹指令的用法或原理。