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

C++ I/O 流與文件處理完整指南:從標準流到二進制隨機訪問

     編輯:關於C++

C++ 流體系架構

C++ I/O 採用流抽象,核心類繼承關係:

ios_base (格式狀態、區域設置)
    ↓
ios (關聯 streambuf)
    ↙           ↘
istream       ostream (虛繼承 ios)
    ↓           ↓
iostream (多重繼承)
    ↓
fstream (文件流)

核心流對象

對象類型用途緩衝特性
`cin``istream`標準輸入行緩衝 (遇 `\n` 刷新)
`cout``ostream`標準輸出行緩衝 (交互) / 全緩衝 (重定向)
`cerr``ostream`標準錯誤無緩衝 (立即輸出)
`clog``ostream`標準日誌全緩衝

流狀態與格式控制


文件流操作詳解

打開模式組合


文本文件讀寫


二進制文件隨機訪問

(records), sizeof(records));

// 隨機讀取第 2 條記錄 (0-based)
std::ifstream bin_in("records.dat", std::ios::binary);
Record rec;
bin_in.seekg(1 * sizeof(Record), std::ios::beg); // 定位
bin_in.read(reinterpret_cast(&rec), sizeof(Record));

// 修改第 1 條記錄
std::fstream bin_io("records.dat", std::ios::in | std::ios::out | std::ios::binary);
bin_io.seekp(0 * sizeof(Record), std::ios::beg);
records[0].score = 99.9;
bin_io.write(reinterpret_cast(&records[0]), sizeof(Record));

// 獲取文件大小
bin_in.seekg(0, std::ios::end);
std::streampos fsize = bin_in.tellg();
size_t count = fsize / sizeof(Record);

緩衝區深度解析

streambuf 核心角色

  • 管理輸入/輸出緩衝區內存
  • 提供 `underflow()` (輸入填充)、`overflow()` (輸出刷新)、`sync()` (同步)
  • 派生自定義 `streambuf` 可實現:內存流、網絡流、壓縮流、加密流

自定義內存流示例


高級技巧與最佳實踐

1. 快速 I/O 優化

class Serializable {
    int id_; std::string name_;
public:
    void save(std::ostream& os) const {
        os.write(reinterpret_cast(&id_), sizeof(id_));
        size_t len = name_.size();
        os.write(reinterpret_cast(&len), sizeof(len));
        os.write(name_.data(), len);
    }
    void load(std::istream& is) {
        is.read(reinterpret_cast(&id_), sizeof(id_));
        size_t len; is.read(reinterpret_cast(&len), sizeof(len));
        name_.resize(len);
        is.read(&name_[0], len);
    }
};

3. 管道與進程間通信


4. 異常安全的文件操作


常見坑點總結

問題原因解決
二進制讀寫亂碼文本模式下 `\n` ↔ `\r\n` 轉換必須指定 `std::ios::binary`
`getline` 讀空行前一次 `>>` 留下換行符`in.ignore()` 或統一用 `getline`
數據未寫入磁盤緩衝區未刷新/程序崩潰關鍵數據用 `flush`、`sync_with_stdio(false)` 時手動刷新
隨機訪問定位錯誤文本模式下位置非字節偏移二進制模式 + `seekg/seekp`
結構體對齊導致大小不一致編譯器插入填充字節`#pragma pack(1)` 或手動序列化

總結

C++ I/O 流體系以「流」為抽象核心,通過「流緩衝區」解耦設備細節。掌握:

  1. 四大標準流的緩衝特性與適用場景
  2. 文件打開模式的組合語義,特別是 `binary` 避免換行轉換
  3. 隨機訪問:`seekg/seekp/tellg/tellp` 配合二進制模式
  4. 格式化控制:操纵子、格式標誌保存恢復
  5. 自定義 streambuf:擴展流功能的終極手段
  6. RAII + 原子寫入:異常安全的文件更新模式

理解「緩衝區是性能與正確性的平衡點」,在競程追求極速關閉同步,在工程追求穩健管理緩衝,是 C++ I/O 進階的分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved