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

C++ 文件讀取完全指南:C 風格 vs C++ 流式操作對比

     編輯:C++ 入門

文件 I/O 是 C++ 開發的基礎技能。本文對比 C 標準庫(stdio.h)與 C++ 標準庫(fstream)兩種讀取文件的主流方式,分析優缺點與適用場景,提供生產級代碼範例。

方式一:C 風格底層操作(FILE*)

適合需精確控制緩衝區、二進制讀寫、或與 C 代碼互操作的場景。

  1. // 讀取整個文件到記憶體
  2. char* readFileC(const char* path, long& outLen) {
  3. FILE* fp = fopen(path, "rb"); // 二進制模式避免換行轉換
  4. if (!fp) return nullptr;
  5. fseek(fp, 0, SEEK_END);
  6. long len = ftell(fp);
  7. rewind(fp);
  8. char* buf = new char[len + 1];
  9. if (buf) {
  10. size_t read = fread(buf, 1, len, fp);
  11. buf[read] = '\0'; // 確保字串結尾
  12. }
  13. fclose(fp);
  14. outLen = len;
  15. return buf; // 呼叫端負責 delete[]
  16. }

關鍵點

  • fseek/ftell 獲取大小需注意 32 位系統 long 可能不足 2GB,大文件應用 fseeko/ftello 或 _fseeki64。
  • 二進制模式 "rb" 避免 Windows 下 \r\n 轉換導致位置計算偏差。
  • 手動記憶體管理易洩漏,建議封裝 RAII 包裝類。

方式二:C++ 流式操作(ifstream)

類型安全、支援字串直接讀取、異常處理、區域化設定,是現代 C++ 首選。

  1. #include <fstream> // ifstream
  2. #include <string>
  3. #include <vector>
  4. // 逐行讀取文本文件
  5. bool readLines(const std::string& path, std::vector<std::string>& lines) {
  6. std::ifstream in(path);
  7. if (!in) return false;
  8. std::string line;
  9. while (std::getline(in, line)) {
  10. lines.push_back(line);
  11. }
  12. return true;
  13. }
  14. // 一次性讀取整個文件到字串(C++11)
  15. std::string readAll(const std::string& path) {
  16. std::ifstream in(path, std::ios::binary | std::ios::ate);
  17. if (!in) throw std::runtime_error("Cannot open file");
  18. std::streamsize size = in.tellg();
  19. in.seekg(0, std::ios::beg);
  20. std::string buffer(size, '\0');
  21. if (!in.read(&buffer[0], size)) throw std::runtime_error("Read failed");
  22. return buffer;
  23. }

優勢亮點

  • RAII 自動關閉文件,無洩漏風險。
  • std::getline 自動處理跨平台換行符(\n/\r\n)。
  • 異常機制(exceptions())可強制錯誤拋出,避免忽略失敗。
  • 支援 std::stringstream 進行記憶體內格式化解析。

效能對比與選擇建議

維度C 風格C++ 流
執行速度略快(無格式化開銷)略慢(區域化、格式化層)
二進制讀寫原生支援需 binary 模式,同等效能
文字處理手動解析豐富操作符、getline
記憶體安全手動管理,高風險RAII,極低風險
類型安全無強類型
跨平台換行需自行處理自動處理

選擇原則

  1. 預設選 C++ 流:安全、可維護、功能豐富。
  2. 高效能/大文件/二進制協議:考慮 C 風格或 mmap/ReadFile 等平台 API。
  3. 舊代碼整合:維持風格一致,邊界處封裝轉換層。

進階技巧:自定義緩衝區優化流效能

  1. std::ifstream in("bigfile.dat", std::ios::binary);
  2. char buffer[65536]; // 64KB 緩衝區
  3. in.rdbuf()->pubsetbuf(buffer, sizeof(buffer));

可顯著提升大文件讀取吞吐量。

總結

C++ 文件讀取推薦以 fstream 為主,善用 RAII 與標準演算法(如 std::istreambuf_iterator)編寫簡潔健壯的代碼。理解 C 風格底層機制有助於處理特殊場景與效能調優。

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