C++ 第四階段 文件IO - 第一節:ifstream/ofstream操作

目錄

一、文件 IO 的基本概念

二、文件流的基本操作

1. 打開文件

2. 關閉文件

3. 檢查文件是否成功打開

三、文本文件的讀寫操作

1. 寫入文本文件(ofstream)

2. 讀取文本文件(ifstream)

四、二進制文件的讀寫操作

1. 寫入二進制文件

2. 讀取二進制文件

五、文件打開模式

六、異常處理與文件 IO

七、常見錯誤與調試技巧

八、完整示例

1. 文本文件的讀寫

2. 二進制文件的讀寫

九、總結


C++從入門到入土學習導航_c++學習進程-CSDN博客

一、文件 IO 的基本概念

C++ 中的文件 IO(輸入/輸出)操作主要通過 ifstream(輸入文件流)和 ofstream(輸出文件流)實現,它們分別用于從文件讀取數據和向文件寫入數據。

  • ifstream:從文件讀取數據(輸入流)。
  • ofstream:向文件寫入數據(輸出流)。
  • fstream:支持同時讀取和寫入文件(雙向流)。

頭文件#include <fstream>
繼承關系ifstream 繼承自 istreamofstream 繼承自 ostreamfstream 繼承自 iostream


二、文件流的基本操作

1. 打開文件

可以通過以下兩種方式打開文件:

  1. 構造函數直接打開
    std::ifstream ifs("example.txt");  // 以只讀模式打開文件
    std::ofstream ofs("output.txt");  // 以寫入模式打開文件
  2. 使用?open()?方法
    std::ifstream ifs;
    ifs.open("example.txt");  // 以默認模式打開文件
2. 關閉文件

文件操作完成后需調用 close() 方法釋放資源:

ifs.close();  // 關閉輸入流
ofs.close();  // 關閉輸出流
3. 檢查文件是否成功打開

使用 is_open() 方法檢查文件是否成功打開:

if (!ifs.is_open()) {std::cerr << "文件打開失敗!" << std::endl;
}

三、文本文件的讀寫操作

1. 寫入文本文件(ofstream)

使用 << 插入器向文件寫入數據:

#include <fstream>
#include <iostream>int main() {std::ofstream ofs("output.txt");if (!ofs) {std::cerr << "無法創建文件!" << std::endl;return 1;}ofs << "Hello, World!" << std::endl;ofs << "This is a test." << std::endl;ofs.close();return 0;
}
2. 讀取文本文件(ifstream)

使用 >> 提取器或 getline() 逐行讀取數據:

#include <fstream>
#include <iostream>
#include <string>int main() {std::ifstream ifs("output.txt");if (!ifs) {std::cerr << "文件不存在!" << std::endl;return 1;}std::string line;while (std::getline(ifs, line)) {std::cout << line << std::endl;}ifs.close();return 0;
}

四、二進制文件的讀寫操作

1. 寫入二進制文件

使用 write() 方法以二進制格式寫入數據:

#include <fstream>
#include <iostream>struct Data {int id;double value;
};int main() {Data data = {1, 3.14};std::ofstream ofs("binary.dat", std::ios::binary);  // 以二進制模式打開if (!ofs) {std::cerr << "無法創建二進制文件!" << std::endl;return 1;}ofs.write(reinterpret_cast<char*>(&data), sizeof(data));  // 寫入結構體ofs.close();return 0;
}
2. 讀取二進制文件

使用 read() 方法以二進制格式讀取數據:

#include <fstream>
#include <iostream>struct Data {int id;double value;
};int main() {Data data;std::ifstream ifs("binary.dat", std::ios::binary);  // 以二進制模式打開if (!ifs) {std::cerr << "無法讀取二進制文件!" << std::endl;return 1;}ifs.read(reinterpret_cast<char*>(&data), sizeof(data));  // 讀取結構體ifs.close();std::cout << "ID: " << data.id << ", Value: " << data.value << std::endl;return 0;
}

五、文件打開模式

模式描述
std::ios::in以讀取模式打開文件(默認用于?ifstream)。
std::ios::out以寫入模式打開文件(默認用于?ofstream)。
std::ios::app追加模式,在文件末尾寫入內容。
std::ios::binary以二進制模式打開文件(默認是文本模式)。
std::ios::trunc如果文件存在,則清空內容(默認用于?ofstream)。
std::ios::ate打開文件后立即將文件指針定位到文件末尾。

組合模式示例

std::ofstream ofs("log.txt", std::ios::out | std::ios::app);  // 追加寫入

六、異常處理與文件 IO

文件操作可能因文件不存在、權限不足等原因失敗,需結合異常處理:

#include <fstream>
#include <iostream>
#include <stdexcept>int main() {try {std::ifstream ifs("missing.txt");if (!ifs) {throw std::runtime_error("文件打開失敗!");}// 讀取文件...} catch (const std::exception& e) {std::cerr << "異常: " << e.what() << std::endl;}return 0;
}

七、常見錯誤與調試技巧

  1. 文件路徑問題

    • 相對路徑:相對于當前工作目錄(通常為項目根目錄)。
    • 絕對路徑:如?"C:/Users/YourName/Desktop/file.txt"
    • 解決方法:檢查文件是否存在,或使用?std::filesystem::absolute()?獲取絕對路徑(C++17 起)。
  2. 文件權限問題

    • 確保程序有權限讀取/寫入目標文件(如修改文件屬性或運行程序時以管理員權限啟動)。
  3. 二進制文件讀寫不一致

    • 二進制寫入和讀取必須使用相同的模式(如?std::ios::binary),否則可能導致數據損壞。
  4. 調試工具

    • 使用?std::cerr?輸出錯誤信息。
    • 使用?Valgrind?檢測內存泄漏。
    • 使用?GDB?或 IDE 調試器逐步執行代碼。

八、完整示例

1. 文本文件的讀寫
#include <fstream>
#include <iostream>
#include <string>int main() {// 寫入文件std::ofstream ofs("example.txt");if (ofs) {ofs << "C++ 文件 IO 示例" << std::endl;ofs << "這是第二行內容。" << std::endl;ofs.close();}// 讀取文件std::ifstream ifs("example.txt");if (ifs) {std::string line;while (std::getline(ifs, line)) {std::cout << line << std::endl;}ifs.close();}return 0;
}
2. 二進制文件的讀寫
#include <fstream>
#include <iostream>struct Student {int id;std::string name;
};int main() {Student student = {101, "Alice"};std::ofstream ofs("students.dat", std::ios::binary);if (ofs) {ofs.write(reinterpret_cast<char*>(&student), sizeof(Student));ofs.close();}Student readStudent;std::ifstream ifs("students.dat", std::ios::binary);if (ifs) {ifs.read(reinterpret_cast<char*>(&readStudent), sizeof(Student));ifs.close();std::cout << "ID: " << readStudent.id << ", Name: " << readStudent.name << std::endl;}return 0;
}

九、總結

通過 ifstreamofstream,可以高效地實現 C++ 中的文件讀寫操作。關鍵點包括:

  1. 正確使用文件模式(如?std::ios::binarystd::ios::app)。
  2. 檢查文件是否成功打開is_open())。
  3. 結合異常處理try/catch)確保程序健壯性。
  4. 區分文本和二進制文件的讀寫方式
  5. 調試文件路徑和權限問題,避免因環境問題導致失敗。

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

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

相關文章

容聲W60以光水離子科技實現食材“主動養鮮”

炎炎夏日&#xff0c;孩子沉迷電視手機屏幕&#xff0c;視力堪憂&#xff1f;高價買回的“超級食物”羽衣甘藍、車厘子&#xff0c;幾天就蔫了&#xff1f;切開的西瓜放進冰箱&#xff0c;卻怕沾染細菌&#xff1f;7月5日&#xff0c;容聲冰箱“WILL養鮮 高能一夏”新品發布會給…

力扣面試150(13/150)

7.3 380. O(1) 時間插入、刪除和獲取隨機元素 實現RandomizedSet 類&#xff1a; RandomizedSet() 初始化 RandomizedSet 對象bool insert(int val) 當元素 val 不存在時&#xff0c;向集合中插入該項&#xff0c;并返回 true &#xff1b;否則&#xff0c;返回 false 。bool…

需要scl來指定編譯器的clangd+cmake在vscode/cursor開發環境下的配置

最近cursor更新了插件商店&#xff0c;只能使用默認它魔改的c/c插件&#xff08;基于clangd的&#xff09;&#xff0c;手頭剛好在折騰一個cmake工程&#xff0c;試試水嘗試直接配置在cursor上可以編譯運行。 主要是本地環境使用scl來管理gcc/g&#xff0c;所以在配置過程中需要…

docker離線/在線環境下安裝elasticsearch

如果想離線安裝docker、redis、gninx、mysql可參照下面這個。 離線環境下&#xff0c;docker安裝redis、ngnix、mysql 獲取離線包 方式1 找一個能上網的環境&#xff0c;下載elasticsearch的鏡像&#xff0c;然后將這個鏡像導出 docker pull docker.elastic.co/elasticsear…

響應式編程入門教程第一節:揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來!

響應式編程入門教程第一節&#xff1a;揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來&#xff01;-CSDN博客 響應式編程入門教程第二節&#xff1a;構建 ObservableProperty&#xff1c;T&#xff1e; — 封裝 ReactiveProperty 的高級用法-CSDN博客 今天我們來聊聊…

單片機:STM32F103的開發環境搭建

本文將詳細介紹如何搭建STM32F103的開發環境。STM32F103是STMicroelectronics推出的一款基于ARM Cortex-M3內核的32位微控制器&#xff08;MCU&#xff09;&#xff0c;廣泛應用于嵌入式開發。以下是搭建開發環境的詳細步驟&#xff0c;涵蓋硬件準備、軟件安裝、工具鏈配置及簡…

eNSP中實現vlan間路由通信(路由器)

eNSP中實現vlan間路由通信&#xff08;路由器&#xff09; 拓撲圖PC配置 pc1&#xff1a;192.168.10.1255.255.255.0192.168.10.254pc2&#xff1a;192.168.20.1255.255.255.0192.168.20.254pc3&#xff1a; 192.168.10.2255.255.255.0192.168.10.254pc4:192.168.20.2255.255.2…

spring6合集——spring概述以及OCP、DIP、IOC原則

spring6合集——Spring6核心知識點總結啟示錄一、SOLID原則1. 單一職責原則&#xff08;SRP&#xff09;2. 開閉原則&#xff08;OCP&#xff09;3. 里氏替換原則&#xff08;LSP&#xff09;4. 接口隔離原則&#xff08;ISP&#xff09;5. 依賴倒置原則&#xff08;DIP&#x…

Stata如何做機器學習?——SHAP解釋框架下的足球運動員價值驅動因素識別:基于H2O集成學習模型

SHAP解釋框架下的足球運動員價值驅動因素識別——基于H2O集成學習模型? 歡迎關注 「阿水實證通」&#xff0c;前沿方法時刻看&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 文章目錄 SHAP解釋框架下的足球運動員價值驅動因素識別——基于H2O集成學習模型?聚焦&…

基于Android的益智游戲學習系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Oracle11G Linux版本(linux_x86_64_oracle11.2.0.4)

Oracle11G Linux版本 linux_x86_64_oracle11.2.0.4 文件分割成 七個 壓縮包&#xff0c;必須集齊 七個 文件后才能一起解壓一起使用&#xff1a; p13390677_112040_Linux-x86-64_7of7.zip下載地址&#xff1a; https://download.csdn.net/download/weixin_43800734/20303421 p1…

C++20中的counting_semaphore的應用

一、std::counting_semaphore 在前面介紹過C20中的同步庫&#xff0c;其中就提到過std::counting_semaphore。但當時的重點是同步庫的整體介紹&#xff0c;本文則會對std::counting_semaphore這個信號量進行一個全面的分析和說明&#xff0c;并有針對性的給出具體的例程。 C20中…

mongo常用命令

1 連接mongo服務器 mongo ip:端口/庫名 -u 用戶名 -p 密碼 2 選擇數據庫 show dbs; 顯示數據庫列表 use 數據庫名稱; 3 集合操作 &#xff08;1&#xff09; 顯示集合列表 show tables; &#xff08;2&#xff09;刪除集合 db.集合名稱.drop(); &#xff08;3&#x…

華為云 銀河麒麟 vscode遠程連接

解決方案 檢查 SSH 服務器配置&#xff1a; 在遠程主機上編輯 /etc/ssh/sshd_config 文件 關鍵配置說明&#xff1a; AllowTcpForwarding yes # 允許TCP端口轉發&#xff08;必須開啟&#xff09; AllowAgentForwarding yes # 允許SSH代理轉發&#xff08;可選&#xf…

有限狀態機(Finite State Machine)

文章目錄有限狀態機&#xff08;Finite State Machine&#xff09;簡介狀態機的組成六要素(1) 狀態集合(2) 初態(3) 終態(4) 輸入符號集(5) 輸出符號集(6) 狀態轉移函數狀態機的工作四要素(1) 現態(2) 輸入(3) 輸出(4) 次態FPGA中的狀態機模型1. Moore型狀態機(1) Moore l型(2)…

前端框架中注釋占位與Fragment內容替換的實現與優化

在現代前端開發中&#xff0c;使用注釋占位符替換Fragment內容是一種常見的需求&#xff0c;尤其在處理動態內容、模板預加載和組件復用場景中。React和Vue作為當前最主流的前端框架&#xff0c;提供了不同的實現方式和優化策略&#xff0c;但核心目標都是減少不必要的DOM操作&…

uniapp中使用web-worker性能優化的分享

為什么要使用 web-workers原因很簡單&#xff0c;將復雜的計算邏輯和耗時邏輯放到線程中運行&#xff0c;避免ui阻塞&#xff0c;防止卡頓問題場景&#xff1a;本次運用于GPS 位置更新接入小程序注意事項&#xff1a;微信小程序中只允許存在一個 worker所以&#xff0c;需要再一…

5118 API智能處理采集數據教程

簡數采集器支持調用5118 API接口處理采集的數據標題和內容、關鍵詞、描述等&#xff0c;還可配合簡數采集的SEO功能優化文章數據&#xff0c;對提高收錄有積極的作用。 簡數采集器支持5118接口&#xff1a;5118智能核心詞提取API 和 5118智能摘要提取API 。 接入使用教程 1. …

【深度學習:進階篇】--4.2.詞嵌入和NLP

在RNN中詞使用one_hot表示的問題 假設有10000個詞 每個詞的向量長度都為10000&#xff0c;整體大小太大 沒能表示出詞與詞之間的關系 例如Apple與Orange會更近一些&#xff0c;Man與Woman會近一些&#xff0c;取任意兩個向量計算內積都為0 目錄 1.詞嵌入 1.1.特點 1.3.wor…

WebRTC 的 ICE candidate 協商

文章目錄 前言WebRTC 的 ICE candidate 協商1. 什么是 ICE candidate&#xff1f;2. ICE 協商的流程3.前端使用 ICE candidate 協商代碼示例1&#xff09;收集 candidate 并發送2&#xff09;WebSocket 接收 candidate 并添加 4. ICE candidate 的類型5. ICE 協商常見問題6. 關…