首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 進階程式設計:檔案流、異常處理、動態記憶體與命名空間實戰

     編輯:關於C++

檔案 I/O:<fstream> 完整指南

C++ 以流抽象檔案操作,fstream 提供三大類別:

  • ofstream:輸出檔案(寫入)
  • ifstream:輸入檔案(讀取)
  • fstream:讀寫皆可

開啟檔案模式旗標

可組合使用: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 全域)

最佳實踐總結

  1. 檔案操作:RAII 型別自動關閉,檢查 is_open(),二進位資料用 binary 模式。
  2. 異常:按值拋出、按參考捕獲,使用標準異常體系,避免在解構函數拋出異常。
  3. 動態記憶體:優先用智慧指標/容器,手動 new/delete 僅在底層庫必要時使用。
  4. 命名空間:避免 using namespace std; 在頭檔,實作檔可接受,大型專案建議明確限定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式含義
ios::in讀取模式
ios::out寫入模式
ios::app附加模式(寫入前移至檔尾)
ios::trunc截斷現有檔案
ios::binary二進位模式