C++學習筆記(二十一)——文件讀寫

一、文件讀寫

作用:
文件讀寫指的是將數據從程序存儲到文件,或從文件讀取數據,以實現數據的持久化存儲
C++ 提供了 fstream 頭文件,用于文件操作,主要包括:

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

應用場景:

  • 配置文件(保存程序設置)
  • 日志系統(記錄程序運行狀態)
  • 數據存儲(存儲用戶數據、序列化對象)

二、C++ 文件操作庫

頭文件#include <fstream>

(1)主要類:

作用
ofstream寫文件
ifstream讀文件
fstream讀寫文件

(2)文件打開模式(open()mode 參數)

模式作用
ios::in只讀方式打開文件(文件必須存在)
ios::out寫入方式打開文件(文件不存在會創建,存在則清空)
ios::app追加方式打開文件(數據追加到文件末尾)
ios::binary二進制模式打開文件
ios::ate打開文件并移動到文件末尾
ios::trunc清空文件內容(默認行為)

(3)文件讀寫方法

操作方法
寫入文件ofstream<<write()
讀取文件ifstream>>getline()read()
讀寫文件fstream<<>>seekg()
文本文件ifstream/ofstream逐行讀寫
二進制文件ifstream/ofstream + ios::binarywrite()read()

注意:

  • 文本文件: getline() 逐行讀取;
  • 二進制文件: read()/write() 提高性能;
  • fstream 用于同時讀寫,避免頻繁打開關閉文件。

(4)文件狀態檢查函數

文件狀態檢查函數,返回值是一個布爾值

函數名作用
good()文件流是否處于正常狀態,沒有遇到任何錯誤或異常
fail()是否發生格式錯誤或輸入/輸出操作失敗(但不包括 badbit)
eof()是否讀取操作到達文件末尾
bad()是否發生了嚴重錯誤,如磁盤損壞、系統錯誤等

三、寫入文件(ofstream

示例1——向文件寫入數據

#include <iostream>
using namespace std;
#include <fstream>int main() {ofstream outFile("test.txt");  // 創建并打開文件if (!outFile){cout << "文件打開失敗!" << endl;return -1;}outFile << "Hello, C++ 文件操作!" << endl;outFile << "寫入第二行數據" << endl;outFile.close();  // 關閉文件cout << "數據已寫入 test.txt" << endl;system("pause");return 0;
}

注意:

  • ofstream outFile("test.txt"):創建/打開 test.txt,默認清空文件
  • outFile << "內容"向文件寫入數據
  • outFile.close()關閉文件,釋放資源。

示例2——追加模式寫入文件

#include <iostream>
using namespace std;
#include <fstream>int main() {ofstream outFile("test.txt", ios::app);  // 追加模式outFile << "追加數據 1" << endl;outFile << "追加數據 2" << endl;outFile.close();system("pause");return 0;
}

注意:

  • ios::app 追加模式,不會清空文件,而是在末尾追加數據

四、 讀取文件(ifstream

示例1——逐行讀取文件

#include <iostream>
using namespace std;
#include <fstream>
#include <string>int main() {ifstream inFile("test.txt");  // 打開文件if (!inFile){cout << "文件打開失敗!" << endl;return -1;}string line;while (getline(inFile, line)) // 逐行讀取{cout << line << endl;}inFile.close(); // 關閉文件system("pause");return 0;
}

注意:

  • getline(inFile, line) 逐行讀取文件內容,存入 line 變量。

示例2——逐個字符讀取文件

#include <iostream>
using namespace std;
#include <fstream>int main() {ifstream inFile("test.txt"); // 打開文件if (!inFile){cout << "文件打開失敗!" << endl;return -1;}char ch;while (inFile.get(ch)) // 逐個字符讀取{cout << ch;}inFile.close(); // 關閉文件system("pause");return 0;
}

注意:

  • 適用于逐個字符解析文件,如讀取二進制文件處理格式化文本

五、讀寫文件(fstream

示例——同時讀寫文件

#include <iostream>
using namespace std;
#include <fstream>
#include <string>int main() {fstream file("data.txt", ios::in | ios::out | ios::app);  // 讀寫+追加if (!file){cout << "文件打開失敗!" << endl;return -1;}file << "新數據寫入" << endl;file.seekg(0);  // 移動到文件開頭string line;while (getline(file, line)){cout << line << endl;}file.close(); // 關閉文件system("pause");return 0;
}

注意:

  • fstream 同時支持讀寫ios::in | ios::out 使得文件可讀可寫。
  • seekg(0)讀指針移到文件開頭,確保讀取最新內容。

六、特殊用法

(1)處理二進制文件

示例1——寫入二進制文件

#include <iostream>
using namespace std;
#include <fstream>struct Person 
{char name[20];int age;
};int main() {ofstream outFile("person.dat", ios::binary); // 創建并打開二進制文件Person p1 = { "Alice", 25};outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1));  // 寫入二進制數據outFile.close(); // 關閉文件system("pause");return 0;
}

注意:

  • ios::binary 以二進制模式打開文件
  • write(reinterpret_cast<char*>(&p1), sizeof(p1)) 將結構體寫入文件

示例2——讀取二進制文件

#include <iostream>
using namespace std;
#include <fstream>struct Person
{char name[20];int age;
};int main() {ifstream inFile("person.dat", ios::binary); // 打開二進制文件Person p;inFile.read(reinterpret_cast<char*>(&p), sizeof(p));  // 讀取二進制數據cout << "姓名: " << p.name << ", 年齡: " << p.age << endl;inFile.close(); // 關閉文件system("pause");return 0;
}

注意:

  • 適用于存儲復雜數據結構(如 struct)。
  • 文件大小更小,讀取速度更快

(2) 檢查文件流的狀態

作用:
good() 是 C++ 中std::ifstreamstd::ofstreamstd::fstream文件流類提供的成員函數之一。它可以檢查文件流的狀態,判斷是否處于“良好”狀態,即文件流沒有遇到任何錯誤或異常情況。

示例:

#include <iostream>
using namespace std;
#include <fstream>int main()
{ifstream file("test.txt");if (file.good()){cout << "文件可以正常讀取!" << std::endl;}else{cout << "文件不可讀!可能不存在或發生了錯誤!" << std::endl;}file.close(); // 關閉文件system("pause");return 0;
}

(3) 獲取文件大小

作用:

  • tellg() 是 C++ 中 std::ifstream(輸入文件流)的成員函數,用于獲取當前文件讀取位置的指針(文件指針),即讀取操作即將在文件中的哪個字節位置執行
  • tellg() 常與 seekg() 結合使用,以計算文件大小

示例:

#include <iostream>
using namespace std;
#include <fstream>struct Person
{char name[20];int age;
};int main()
{ofstream outFile("person.dat", ios::binary); // 創建并打開二進制文件Person p1 = { "Alice", 25 };outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1));  // 寫入二進制數據outFile.close(); // 關閉文件ifstream file("person.dat", ios::binary); // 打開二進制文件file.seekg(0, ios::end);  // 將指針移動到文件末尾streampos fileSize = file.tellg();  // 獲取當前位置,即文件大小cout << "文件大小: " << fileSize << " 字節" << std::endl;file.close();system("pause");return 0;
}

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

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

相關文章

RBA+minibatch的嘗試

目錄 還是咬著牙來寫 RBA了 JAX JAX->TORCH torch tensor的變形 pytorch怎么把一個【3,3,5】的tensor變成【3,10,5】&#xff0c;多的用0填充 pytorch如何把shape【100】轉成【100,1】 把torch shape【100,1】變成【100】 SQUEEZE grad_fn 不能兩次反向傳播 還…

基于Python+Django的二手房信息管理系統

項目介紹 PythonDjango二手房信息管理系統(Pycharm Django Vue Mysql) 平臺采用B/S結構&#xff0c;后端采用主流的Python語言進行開發&#xff0c;前端采用主流的Vue.js進行開發。 整個平臺包括前臺和后臺兩個部分。 - 前臺功能包括&#xff1a;首頁、二手房信息、公告管理、…

爬蟲基礎之爬取貓眼Top100 可視化

網站: TOP100榜 - 貓眼電影 - 一網打盡好電影 本次案例所需用到的模塊 requests (發送HTTP請求) pandas(數據處理和分析 保存數據) parsel(解析HTML數據) pyecharts(數據可視化圖表) pymysql(連接和操作MySQL數據庫) lxml(數據解析模塊) 確定爬取的內容: 電影名稱 電影主演…

解決Qt信號在構造函數中失效的問題

情景引入&#xff1a;音樂播放器的“幽靈列表”問題 假設你正在開發一個音樂播放器應用&#xff0c;其中有一個功能是用戶首次打開應用時&#xff0c;需要從服務器拉取最新的歌曲列表并顯示在“本地音樂”頁面中。你可能會寫出類似這樣的代碼&#xff1a; // LocalSong 類的構…

Hadoop 啟動,發現 namenode、secondary namenodes,這兩個沒有啟動,報錯超時。

今天在啟動 hadoop 的時候&#xff0c;發現本應該同時啟動的 namenode、secondary namenodes 卻都沒有啟動。我還以為是壞了又重新裝了虛擬機&#xff0c;重新下載 Hadoop 重新配置結果還是同樣的問題&#xff0c;那沒辦法只能去解決問題了。 首先先再次嘗試啟動看他報錯是什么…

Ranger 鑒權

Apache Ranger 是一個用來在 Hadoop 平臺上進行監控&#xff0c;啟用服務&#xff0c;以及全方位數據安全訪問管理的安全框架。 使用 ranger 后&#xff0c;會通過在 Ranger 側配置權限代替在 Doris 中執行 Grant 語句授權。 Ranger 的安裝和配置見下文&#xff1a;安裝和配置 …

Sqlserver安全篇之_啟用和禁用Named Pipes的案列介紹

https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/named-pipes-properties?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/client-protocols-named-pipes-properties-protocol-tab?viewsql-server-ver16 默認…

深入解析過濾器模式(Filter Pattern):一種靈活高效的設計模式

過濾器模式&#xff08;Filter Pattern&#xff09;&#xff0c;也被稱為標準模式&#xff0c;是一種常見的結構型設計模式。它通過將對象分為不同的標準或條件&#xff0c;使得對對象集合的操作變得更加靈活和高效。特別適用于處理復雜查詢和條件過濾的場景。過濾器模式不僅能…

Spring Boot 整合 Elasticsearch 實踐:從入門到上手

引言 Elasticsearch 是一個開源的分布式搜索引擎&#xff0c;廣泛用于日志分析、搜索引擎、數據分析等場景。本文將帶你通過一步步的教程&#xff0c;在 Spring Boot 項目中整合 Elasticsearch&#xff0c;輕松實現數據存儲與查詢。 1. 創建 Spring Boot 項目 首先&#xff…

2025年Postman的五大替代工具

雖然Postman是一個廣泛使用的API測試工具&#xff0c;但許多用戶在使用過程中會遇到各種限制和不便。因此&#xff0c;可能需要探索替代解決方案。本文介紹了10款強大的替代工具&#xff0c;它們能夠有效替代Postman&#xff0c;成為你API測試工具箱的一部分。 什么是Postman&…

Redis之單線程與多線程

redis 單線程與多線程 Redis是單線程&#xff0c;主要是指Redis的網絡IO和鍵值對讀寫是由一個線程來完成的&#xff0c;Redis在處理客戶端的請求時包含獲取(socket讀)、解析、執行、內容返回&#xff08;socket寫&#xff09;等都由一個順序串行的主線程處理&#xff0c;這就是…

C#的簡單工廠模式、工廠方法模式、抽象工廠模式

工廠模式是一種創建型設計模式&#xff0c;主要將對象的創建和使用分離&#xff0c;使得系統更加靈活和可維護。常見的工廠模式有簡單工廠模式、工廠方法模式和抽象工廠模式&#xff0c;以下是 C# 實現的三個案例&#xff1a; 簡單工廠模式 簡單工廠模式通過一個工廠類來創建…

python基礎8 單元測試

通過前面的7個章節&#xff0c;作者學習了python的各項基礎知識&#xff0c;也學習了python的編譯和執行。但在實際環境上&#xff0c;我們需要驗證我們的代碼功能符合我們的設計預期&#xff0c;所以需要結合python的單元測試類&#xff0c;編寫單元測試代碼。 Python有一個內…

算法刷題力扣

先把大寫的字母變成小寫的&#xff0c;用大寫字母32即可變為小寫字母。 寫循環跳過字符。 然后判斷是否相等即可。具體代碼如下&#xff1a; class Solution { public: bool isPalindrome(string s) { int sizes.size(); int begin0; int ends.size()-1; for(int i0;i<s…

allure下載安裝及配置

這里寫目錄標題 一、JDK下載安裝及配置二、allure下載三、allure安裝四、allure環境變量配置五、allure驗證是否安裝成功 一、JDK下載安裝及配置 allure 是一個java測試報告框架。所以要基于JDK環境。 JDK下載與安裝及配置&#xff1a;https://blog.csdn.net/qq_24741027/arti…

linux之 內存管理(1)-armv8 內核啟動頁表建立過程

一、內核啟動時&#xff0c;頁表映射有哪些&#xff1f; Linux初始化過程&#xff0c;會依次建立如下頁表映射&#xff1a; 1.恒等映射&#xff1a;頁表基地址idmap_pg_dir; 2.粗粒度內核鏡像映射&#xff1a;頁表基地址init_pg_dir; 3.fixmap映射&#xff1a;頁表基地址為…

【面試問題】Java 接口與抽象類的區別

引言 在 Java 面向對象編程中&#xff0c;接口&#xff08;Interface&#xff09;和抽象類&#xff08;Abstract Class&#xff09;是兩個重要的抽象工具。它們都能定義未實現的方法&#xff0c;但設計目標和使用場景截然不同。本文將通過語法、特性和實際案例&#xff0c;深入…

【資料分享】全志科技T113-i全國產(1.2GHz雙核A7 RISC-V)工業核心板規格書

核心板簡介 創龍科技SOM-TLT113 是一款基于全志科技T113-i 雙核ARM Cortex-A7 玄鐵C906 RISC-V HiFi4 DSP 異構多核處理器設計的全國產工業核心板&#xff0c;ARM Cortex-A7 處理單元主頻高達1.2GHz。核心板 CPU、ROM、RAM、電源、晶振等所有元器件均采用國產工業級方案&…

R語言高效數據處理-自定義格式EXCEL數據輸出

注&#xff1a;以下代碼均為實際數據處理中的筆記摘錄&#xff0c;所以很零散&#xff0c; 將就看吧&#xff0c;這一篇只是代表著我還在&#xff0c;所以可能用處不大&#xff0c;這一段時間都很煎熬&#xff01; 在實際數據處理中為了提升效率&#xff0c;將Excel報表交付給…

LeetCode 30 —— 30.串聯所有單詞的子串

題目&#xff1a; 給定一個字符串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。 注意子串要與 words 中的單詞完全匹配&#xff0c;中間不能有其他字符&#xff0c;但不需要考慮 words 中單詞串聯的順序。 示例 1&#xff…