C++中IO文件輸入輸出知識詳解和注意事項

以下內容將從文件流類體系打開模式文本與二進制 I/O隨機訪問錯誤處理性能優化等方面,詳解 C++ 中文件輸入輸出的使用要點,并配以示例。


一、文件流類體系

C++ 標準庫提供三種文件流類型,均定義在 <fstream> 中:

  • std::ifstream:輸入文件流,用于從文件讀取(繼承自 std::istream)。
  • std::ofstream:輸出文件流,用于向文件寫入(繼承自 std::ostream)。
  • std::fstream:讀寫文件流,可同時做輸入和輸出(繼承自兩者)。

它們的典型用法與標準流 (cin/cout) 類似,但需要先打開文件。


二、打開模式(std::ios_base::openmode

打開時可指定下列模式的按位或(|)組合:

模式含義
std::ios::in打開用于讀操作
std::ios::out打開用于寫操作
std::ios::app所有寫操作均追加到文件末尾
std::ios::trunc打開時清空已有內容(默認對 ofstream 生效)
std::ios::binary二進制模式(屏蔽文本模式下的換行轉換)
std::ios::ate打開后立即定位到文件末尾

示例:

std::ifstream fin("data.txt", std::ios::in);
std::ofstream fout("out.txt", std::ios::out | std::ios::trunc);
std::fstream fs("db.bin", std::ios::in|std::ios::out|std::ios::binary);

三、文本文件 I/O

1. 寫入文本

  • operator<< 與格式化

    std::ofstream fout("log.txt");
    fout << "Count = " << count << '\n';
    
  • std::endl'\n'

    • std::endl 會插入換行并刷新緩沖,頻繁使用有性能開銷;推薦輸出 '\n'

2. 讀取文本

  • 按詞/按行讀取

    std::ifstream fin("data.txt");
    std::string word;
    while (fin >> word) { /* 按空白分隔 */ }fin.clear(); fin.seekg(0);
    std::string line;
    while (std::getline(fin, line)) { /* 讀取整行,不含換行符 */ }
    
  • 混合 >>getline
    使用 >> 后會留下換行符,若緊接 getline,會讀入一個空行。
    解決:每次切換前調用 fin.ignore() 跳過殘留的 '\n'


四、二進制文件 I/O

當讀寫原始字節或 POD 結構時,選用二進制模式并使用 read/write

struct Record { int id; double value; };void writeRecords(const std::vector<Record>& recs) {std::ofstream fout("rec.bin", std::ios::out|std::ios::binary);fout.write(reinterpret_cast<const char*>(recs.data()),recs.size()*sizeof(Record));
}std::vector<Record> readRecords() {std::ifstream fin("rec.bin", std::ios::in|std::ios::binary);fin.seekg(0, std::ios::end);std::size_t size = fin.tellg() / sizeof(Record);fin.seekg(0, std::ios::beg);std::vector<Record> recs(size);fin.read(reinterpret_cast<char*>(recs.data()),size*sizeof(Record));return recs;
}
  • 注意:直接寫整體 vector 只對標準布局(POD)類型安全。若含指針或非平凡類型,需循環寫每個字段或序列化。

五、隨機訪問(定位)

  • seekg / seekp:設置讀/寫位置

    fin.seekg(offset, std::ios::beg|std::ios::cur|std::ios::end);
    fout.seekp(...);
    
  • tellg / tellp:返回當前位置

    auto pos = fin.tellg();
    
  • 注意:文本模式下各種平臺會對換行做轉換,seek/tell 不保證以字節為單位精確跳轉;二進制模式下則如你所見。


六、錯誤處理與異常

1. 狀態位檢查

if (!fin) { /* 打開失敗或已處于錯誤狀態 */ }
if (fin.eof()) { /* 到達末尾 */ }
if (fin.fail()) { /* 格式錯誤或開關失敗 */ }

2. 異常模式

fin.exceptions(std::ios::failbit | std::ios::badbit);
try {int x;fin >> x;  // 失敗時拋 std::ios_base::failure
} catch (const std::ios_base::failure& e) {std::cerr << "I/O 異常: " << e.what() << "\n";
}

3. 資源管理

  • 文件流析構時會自動 close(),但若需提前關閉或檢測錯誤,可顯式:

    fin.close();
    if (fin.fail()) std::cerr<<"關閉失敗\n";
    

七、性能優化

  1. 同步關閉

    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    

    可加速與 C 風格 I/O 的混用場景。

  2. 緩沖區大小

    • 默認緩沖區通常足夠;若需高性能可自定義:重載流的 rdbuf()->pubsetbuf()
  3. 減少臨時與拷貝

    • 盡量一次性 read/write 大塊數據;
    • 對文本分詞解析可用 std::string_viewstd::getline 配合 std::stringstream
  4. 避免頻繁開關文件

    • 對同一文件的多次寫入,宜在同一流對象上完成;若交替讀寫,用 fstream 且調用 seek/flush 而非反復構造流。

八、綜合示例

#include <iostream>
#include <fstream>
#include <vector>
#include <string>struct Record { int id; double value; };int main() {// 1. 文本寫入{std::ofstream log("app.log", std::ios::out|std::ios::app);if (!log) throw std::runtime_error("無法打開日志");log << "程序啟動\n";}// 2. 文本讀取與解析{std::ifstream fin("config.txt");if (!fin) {std::cerr<<"配置文件打開失敗\n";} else {std::string line;while (std::getline(fin, line)) {// 跳過空行和注釋if (line.empty() || line[0]=='#') continue;std::cout<<"配置: "<<line<<"\n";}}}// 3. 二進制讀寫std::vector<Record> recs = {{1,1.23},{2,4.56},{3,7.89}};{std::ofstream fout("data.bin", std::ios::out|std::ios::binary);fout.write(reinterpret_cast<const char*>(recs.data()),recs.size()*sizeof(Record));}{std::ifstream fin("data.bin", std::ios::in|std::ios::binary);fin.seekg(0, std::ios::end);size_t n = fin.tellg()/sizeof(Record);fin.seekg(0);std::vector<Record> buf(n);fin.read(reinterpret_cast<char*>(buf.data()), n*sizeof(Record));std::cout<<"讀取 "<<buf.size()<<" 條記錄\n";}return 0;
}

九、注意事項匯總

  1. 選擇合適模式:文本 vs 二進制;是否截斷或追加。
  2. 檢查流狀態:打開后、讀寫后、關閉后都應檢查 fail() / bad() / eof()
  3. 混合讀寫:使用 std::fstream 并在切換前調用 flush() / seekg() / seekp()
  4. 異常安全:開啟異常模式或自行檢測,避免未捕獲錯誤導致數據不一致。
  5. 平臺差異:文本模式下換行轉換、字符編碼(如 Windows 的 CRLF)可能影響跨平臺行為。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83137.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity3D仿星露谷物語開發56之保存角色位置到文件

1、目標 游戲中通過Save Game保存角色位置&#xff0c;當重啟游戲后&#xff0c;通過Load Game可以恢復角色的位置。 2、Player對象操作 &#xff08;1&#xff09;組件添加 給Hierarchy下的Player組件添加Generate GUID組件。 &#xff08;2&#xff09;修改SceneSave.cs腳…

TKernel模塊--雜項

TKernel模塊–雜項 1.DEFINE_HARRAY1 #define DEFINE_HARRAY1(HClassName, _Array1Type_) \ class HClassName : public _Array1Type_, public Standard_Transient { \public: …

c++ typeid運算符

typeid運算符能獲取類型信息。獲取到的是type_info對象。type_info類型如下&#xff1a; 可以看到&#xff0c;這個類刪除了拷貝構造函數以及等號操作符。有一些成員函數&#xff1a;hash_code、before、name、raw_name, 還重載了和!運算符。 測試&#xff1a; void testTyp…

第304個Vulnhub靶場演練攻略:digital world.local:FALL

digital world.local&#xff1a;FALL Vulnhub 演練 FALL (digitalworld.local: FALL) 是 Donavan 為 Vulnhub 打造的一款中型機器。這款實驗室非常適合經驗豐富的 CTF 玩家&#xff0c;他們希望在這類環境中檢驗自己的技能。那么&#xff0c;讓我們開始吧&#xff0c;看看如何…

【數據庫】數據庫恢復技術

數據庫恢復技術 實現恢復的核心是使用冗余&#xff0c;也就是根據冗余數據重建不正確數據。 事務 事務是一個數據庫操作序列&#xff0c;是一個不可分割的工作單位&#xff0c;是恢復和并發的基本單位。 在關系數據庫中&#xff0c;一個事務是一條或多條SQL語句&#xff0c…

switch-case判斷

switch-case判斷 #include <stdio.h> int main() {int type;printf("請輸入你的選擇&#xff1a;\n");scanf("%d",&type);getchar();switch (type){case 1:printf("你好&#xff01;");break;case 2:printf("早上好&#xff01;…

從監控到告警:Prometheus+Grafana+Alertmanager+告警通知服務全鏈路落地實踐

文章目錄 一、引言1.1 監控告警的必要性1.2 監控告警的基本原理1.2.1 指標采集與存儲1.2.2 告警規則與觸發機制1.2.3 多渠道通知與閉環 二、技術選型與架構設計2.1 為什么選擇 Prometheus 及其生態2.1.1 Prometheus 優勢分析2.1.2 Grafana 可視化能力2.1.3 Alertmanager 靈活告…

STM32 UART通信實戰指南:從原理到項目落地

STM32串口通信實戰指南&#xff1a;從零開始手把手教你 前言&#xff1a;為什么串口這么重要&#xff1f; 在嵌入式開發中&#xff0c;串口就像設備的"嘴巴"和"耳朵"。無論是給單片機下達指令、讀取傳感器數據&#xff0c;還是讓兩個模塊"對話"…

Jmeter requests

1.Jemter元件和組件 1.1 元件和組件的概念 元件&#xff1a;多個功能相似的的組件的容器&#xff0c;類似于一個工具箱。 組件&#xff1a;實現某個特定功能的實例&#xff0c;類似于工具箱中的螺絲刀&#xff0c;十字扳手... 1.2 作用域和執行順序 1.2.1 作用域 例子&#…

計算機視覺---GT(ground truth)

在計算機視覺&#xff08;Computer Vision, CV&#xff09;領域&#xff0c;Ground Truth&#xff08;GT&#xff0c;中文常譯為“真值”或“ ground truth”&#xff09; 是指關于數據的真實標簽或客觀事實&#xff0c;是模型訓練、評估和驗證的基準。它是連接算法與現實世界的…

1-Wire 一線式總線:從原理到實戰,玩轉 DS18B20 溫度采集

引言 在嵌入式系統中&#xff0c;通信總線是連接 CPU 與外設的橋梁。從 I2C、SPI 到 UART&#xff0c;每種總線都有其獨特的應用場景。而本文要介紹的1-Wire 一線式總線&#xff0c;以其極簡的硬件設計和獨特的通信協議&#xff0c;在溫度采集、身份識別等領域大放異彩。本文將…

基于開源AI大模型AI智能名片S2B2C商城小程序源碼的銷售環節數字化實現路徑研究

摘要&#xff1a;在數字化浪潮下&#xff0c;企業銷售環節的轉型升級已成為提升競爭力的核心命題。本文基于清華大學全球產業研究院《中國企業數字化轉型研究報告&#xff08;2020&#xff09;》提出的“提升銷售率與利潤率、打通客戶數據、強化營銷協同、構建全景用戶畫像、助…

Linux淺談

Linux淺談 一、什么是 Linux&#xff1f;先拋開 “內核”&#xff0c;看整體 可以把 Linux 系統 想象成一臺 “組裝電腦”&#xff1a; 最核心的零件是 “主板”—— 這就是 Linux 內核&#xff08;Kernel&#xff09;&#xff0c;負責管理電腦里的所有硬件&#xff08;比如 …

PostgreSQL ERROR: out of shared memory處理

使用pg_dump命令導出一個庫的時候&#xff0c;報 pg_dump: error: query failed: ERROR: out of shared memory HINT: You might need to increase "max_locks_per_transaction". 從錯誤字面上看是超出內存大小了&#xff0c;建議增加max_locks_per_transaction參…

IoT/基于NB28-A/BC28-CNV通信模組使用AT指令連接華為云IoTDA平臺(HCIP-IoT實驗2)

文章目錄 概述檢查通信環境通信模組固件信號強度CGATT指令參數 / 啥是PS域&#xff1f;PS附著狀態&#xff1a;ATCGATTPLMN 選擇&#xff1a;ATCOPSCEREG指令參數 / 啥是EPS與EPC?CEREG指令參數 / 啥是URC?網絡注冊狀態&#xff1a;ATCEREG網絡附著和網絡注冊 AT指令接入IoTD…

紅外遙控(外部中斷)

目錄 1.紅外遙控簡介 通信方式&#xff1a; 紅外LED波長&#xff1a; 通信協議標準&#xff1a; 2.硬件電路 發送部分1&#xff1a; 內部元件介紹&#xff1a; 工作原理&#xff1a; 為什么要以38KHZ亮滅&#xff1f; 電路圖&#xff1a; 發送部分2&#xff1a; 電…

【C#】一個簡單的http服務器項目開發過程詳解

這跟安裝NoteJs程序運行腳本文件搭建一個簡單Http服務器一樣&#xff0c;相比起來&#xff0c;它的優點是可以開發的應用是免安裝&#xff0c;跨平臺的&#xff0c;放在移動盤上便捷的&#xff0c;這里著重講http服務器實現的過程&#xff0c;以便自主實現特定的功能和服務。 …

WPF【11_4】WPF實戰-重構與美化(MVVM 架構)

11-9 【理論】MVVM 架構 在 WPF 項目中&#xff0c;我們主要采用的是一種類似 MVC 的架構&#xff0c;叫做 MVVM。 MVVM 繼承了 MVC 的理念&#xff0c;是 Model-View-ViewModel 的縮寫&#xff0c;中文意思是模型、視圖、視圖模型。這三個詞分開看我們都能看懂&#xff0c;不…

使用PowerBI個人網關定時刷新數據

使用PowerBI個人網關定時刷新數據 PowerBI desktop連接mysql&#xff0c;可以設置定時刷新數據或在PowerBI服務中手動刷新數據,步驟如下&#xff1a; 第一步&#xff1a; 下載網關。以個人網關為例&#xff0c;如圖 第二步&#xff1a; 雙擊網關&#xff0c;點擊下一步&…

深度學習驅動的超高清圖修復技術——綜述

Deep Learning-Driven Ultra-High-Definition Image Restoration: A Survey Liyan Wang, Weixiang Zhou, Cong Wang, Kin-Man Lam, Zhixun Su, Jinshan Pan Abstract Ultra-high-definition (UHD) image restoration?? aims to specifically solve the problem of ??quali…