| 模式 | 含義 |
ios::in | 讀取模式 |
ios::out | 寫入模式 |
ios::app | 附加模式(寫入前移至檔尾) |
ios::trunc | 截斷現有檔案 |
ios::binary | 二進位模式 |
可組合使用:ios::out | ios::trunc。
完整讀寫範例
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
string data;
// 寫入
ofstream out("afile.dat");
cout << "Enter name: "; getline(cin, data);
out << data << endl;
cout << "Enter age: "; cin >> data; cin.ignore();
out << data << endl;
out.close();
// 讀取
ifstream in("afile.dat");
in >> data; cout << data << endl;
in >> data; cout << data << endl;
in.close();
return 0;
}
檔案指標定位
seekg() / seekp():移動讀/寫指標
- 參數:位移量 + 參考點(
ios::beg、ios::cur、ios::end)
異常處理:try / catch / throw
異常提供錯誤傳播機制,分離正常邏輯與錯誤處理。
基本語法
try {
// 保護區塊:可能拋出異常的程式碼
double div(int a, int b) {
if (b == 0) throw "Division by zero!";
return a / b;
}
} catch (const char* msg) {
cerr << "錯誤:" << msg << endl;
} catch (...) {
// 捕獲所有其他異常
}
標準異常體系
定義於 <stdexcept>,繼承自 std::exception:
logic_error:邏輯錯誤(invalid_argument、out_of_range 等)
runtime_error:執行期錯誤(overflow_error 等)
自訂異常類別
#include <exception>
struct MyException : public exception {
const char* what() const noexcept override { return "C++ Exception"; }
};
int main() {
try { throw MyException(); }
catch (MyException& e) { cout << e.what() << endl; }
}
動態記憶體管理:new / delete
C++ 記憶體分堆疊(自動變數)與堆積(動態配置)。
基本型別
double* p = new double; // 配置
*p = 29494.99;
delete p; // 釋放,必須配對
陣列
int* arr = new int[20]; // 配置陣列
delete[] arr; // 釋放陣列(必須加 [])
多維陣列
int rows = 2, cols = 3;
double** m = new double*[rows];
for (int i = 0; i < rows; ++i) m[i] = new double[cols];
// 釋放
for (int i = 0; i < rows; ++i) delete[] m[i];
delete[] m;
物件陣列
class Box { public: Box() { cout << "建構\n"; } ~Box() { cout << "解構\n"; } };
Box* boxes = new Box[4]; // 建構函數呼叫 4 次
delete[] boxes; // 解構函數呼叫 4 次
命名空間:解決名稱衝突
命名空間定義作用域,避免不同庫的同名實體衝突。
定義與使用
namespace First { void func() { cout << "First\n"; } }
namespace Second { void func() { cout << "Second\n"; } }
int main() {
First::func(); // 明確限定
using namespace First; // 引入整個命名空間
func(); // 直接呼叫
using Second::func; // 僅引入特定實體
}
進階特性
- 巢狀命名空間:
namespace A { namespace B { ... } },存取用 A::B::name
- 不連續定義:同一命名空間可分散在多檔案
- 匿名命名空間:
namespace { ... } 限定於單一編譯單元(替代 static 全域)
最佳實踐總結
- 檔案操作:RAII 型別自動關閉,檢查
is_open(),二進位資料用 binary 模式。
- 異常:按值拋出、按參考捕獲,使用標準異常體系,避免在解構函數拋出異常。
- 動態記憶體:優先用智慧指標/容器,手動
new/delete 僅在底層庫必要時使用。
- 命名空間:避免
using namespace std; 在頭檔,實作檔可接受,大型專案建議明確限定。
- 上一篇文章: C++ 函數進階:參數傳遞、靜態變數、遞歸與指標返回完整實戰
- 下一篇文章: C++ STL 容器精講:deque 雙端佇列完整操作指南
Copyright ©
程式碼之家 All Rights Reserved