C++ 中文件 IO 操作詳解

在C++中,文件操作是通過流(stream)來實現的。標準庫提供了三種主要的文件流類來處理文件IO操作:

  • ofstream:用于寫入文件(output file stream)
  • ifstream:用于讀取文件(input file stream)
  • fstream:用于讀寫文件(file stream)

這些類都繼承自C++標準庫中的流基類,提供了統一的接口來操作文件。

一、文件流類的基本使用

打開文件

打開文件是進行文件操作的第一步。每個流類都提供了open()方法,也可以在構造函數中直接指定文件名:

#include <fstream>// 使用構造函數打開文件
std::ofstream outFile("example.txt");  // 寫入模式
std::ifstream inFile("example.txt");   // 讀取模式
std::fstream ioFile("example.txt", std::ios::in | std::ios::out);  // 讀寫模式// 或者使用open()方法
std::ofstream outFile2;
outFile2.open("example.txt");
文件打開模式

文件打開模式可以通過位操作符|組合使用:

  • std::ios::in:讀取模式
  • std::ios::out:寫入模式(默認會截斷文件)
  • std::ios::app:追加模式
  • std::ios::ate:打開后定位到文件末尾
  • std::ios::trunc:打開時截斷文件(刪除原有內容)
  • std::ios::binary:二進制模式
檢查文件是否成功打開

在進行文件操作前,應該檢查文件是否成功打開:

if (!outFile.is_open()) {std::cerr << "無法打開文件!" << std::endl;return 1;
}// 或者更簡潔的方式
if (!outFile) {std::cerr << "文件打開失敗!" << std::endl;return 1;
}

二、寫入文件(ofstream)

ofstream類用于向文件寫入數據,它繼承了ostream的功能,因此可以使用<<操作符:

#include <fstream>
#include <iostream>int main() {// 創建并打開文件std::ofstream outFile("data.txt");if (outFile.is_open()) {// 寫入文本數據outFile << "Hello, World!" << std::endl;outFile << "這是一個測試文件。" << std::endl;// 寫入數值數據int number = 42;double pi = 3.14159;outFile << "Number: " << number << ", Pi: " << pi << std::endl;// 寫入自定義數據std::string name = "Doubao";outFile << "Name: " << name << std::endl;// 關閉文件outFile.close();std::cout << "文件寫入成功!" << std::endl;} else {std::cerr << "無法打開文件進行寫入!" << std::endl;}return 0;
}

三、讀取文件(ifstream)

ifstream類用于從文件讀取數據,它繼承了istream的功能,因此可以使用>>操作符或getline()方法:

#include <fstream>
#include <iostream>
#include <string>int main() {// 打開文件std::ifstream inFile("data.txt");if (inFile.is_open()) {// 逐行讀取std::string line;while (std::getline(inFile, line)) {std::cout << line << std::endl;}// 關閉文件inFile.close();} else {std::cerr << "無法打開文件進行讀取!" << std::endl;}return 0;
}
讀取不同類型的數據
#include <fstream>
#include <iostream>
#include <string>int main() {std::ifstream inFile("data.txt");if (inFile.is_open()) {// 讀取字符串std::string text;inFile >> text;std::cout << "讀取的文本: " << text << std::endl;// 讀取整數int number;inFile >> number;std::cout << "讀取的整數: " << number << std::endl;// 讀取浮點數double pi;inFile >> pi;std::cout << "讀取的浮點數: " << pi << std::endl;// 讀取整行(包括空格)std::string fullLine;std::getline(inFile, fullLine);  // 清除緩沖區中的換行符std::getline(inFile, fullLine);std::cout << "讀取的整行: " << fullLine << std::endl;inFile.close();}return 0;
}

四、讀寫文件(fstream)

fstream類結合了ifstreamofstream的功能,可以同時進行讀寫操作:

#include <fstream>
#include <iostream>
#include <string>int main() {// 打開文件進行讀寫,不截斷std::fstream ioFile("data.txt", std::ios::in | std::ios::out);if (ioFile.is_open()) {// 讀取現有內容std::string content;std::getline(ioFile, content);std::cout << "讀取的內容: " << content << std::endl;// 定位到文件末尾進行追加ioFile.seekp(0, std::ios::end);ioFile << "這是追加的內容" << std::endl;// 定位到文件開頭重新讀取ioFile.seekg(0, std::ios::beg);while (std::getline(ioFile, content)) {std::cout << content << std::endl;}ioFile.close();}return 0;
}

五、文件定位和狀態檢查

文件定位

可以使用以下方法控制文件指針位置:

  • tellg():返回輸入位置
  • tellp():返回輸出位置
  • seekg():設置輸入位置
  • seekp():設置輸出位置
狀態檢查

流狀態可以通過以下方法檢查:

  • good():檢查流是否正常
  • eof():檢查是否到達文件末尾
  • fail():檢查是否發生非致命錯誤
  • bad():檢查是否發生致命錯誤
  • clear():清除錯誤標志

六、二進制文件操作

對于二進制文件,需要使用std::ios::binary模式:

#include <fstream>
#include <iostream>int main() {// 寫入二進制數據{std::ofstream outFile("binary.bin", std::ios::binary);int numbers[] = {1, 2, 3, 4, 5};outFile.write(reinterpret_cast<char*>(numbers), sizeof(numbers));}// 讀取二進制數據{std::ifstream inFile("binary.bin", std::ios::binary);int readNumbers[5];inFile.read(reinterpret_cast<char*>(readNumbers), sizeof(readNumbers));for (int i = 0; i < 5; ++i) {std::cout << readNumbers[i] << " ";}std::cout << std::endl;}return 0;
}

七、文件操作的最佳實踐

  1. 始終檢查文件是否成功打開
  2. 使用RAII原則(資源獲取即初始化)管理文件資源
  3. 明確指定文件打開模式
  4. 對于大文件,考慮分塊讀取或寫入
  5. 處理可能的異常情況
  6. 使用std::endl會刷新緩沖區,如需提高性能可使用\n
  7. 對于二進制文件,使用read()write()方法

通過掌握這些文件IO操作,可以在C++中有效地處理各種文件讀寫任務。

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

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

相關文章

第32節 Node.js 全局對象

在Node.js中我們可以直接訪問到全局對象。 這些對象在所有模塊里都是可用的&#xff0c;有些對象不是在全局作用域而是在模塊作用域里&#xff0c;這些情況將在本文的內容中進行介紹。 global {Object} 全局命名空間對象。 在瀏覽器中&#xff0c;全局作用域就是頂級域。如…

Linux文件屬性和權限概述-linux026

Linux文件屬性和權限概述 Linux 系統作為多用戶操作系統&#xff0c;通過文件屬性和權限機制來控制不同用戶對文件和目錄的訪問&#xff0c;從而保證系統的安全性。不同的用戶對同一文件可以有不同的訪問權限&#xff0c;這些權限包括 讀取&#xff08;read&#xff09;、寫入…

nuScenes介紹

目標檢測指標 指標內容mAP&#xff08;mean Average Precision&#xff09;bev下2d中心點的距離來評價&#xff0c;而不是像2d檢測里用iou來評價mATE&#xff08;Average Translation Error&#xff09;中心點的2D歐式距離mASE&#xff08;Average Scale Error&#xff09;中心…

帶中斷計數器的UART接收中斷程序 (8259@400H/402H)

1.程序功能 在中斷服務程序中增加了中斷計數器&#xff0c;并在主循環中通過串口輸出中斷次數。 2.驗證 2.1手動觸發8259的IR1&#xff0c;高電平有效 2.2串口接收 3.測試程序 ; You may customize this and other start-up templates; ; The location of this template is…

在Postgresql中跟蹤SQL語句

文章說明 本文主要說明如何在Postgresql中跟蹤實際執行的SQL語句。 本文內容有如下應用場景&#xff1a; 在系統中執行了一系列的操作&#xff0c;需要將這些操作轉化成SQL在正式環境上一次性執行&#xff0c;省下重新執行一遍的操作時間。最近系統數據被人或被程序修改導致…

【信創-k8s】重磅-鯤鵬arm+麒麟V10離線部署k8s1.30+kubesphere4.1.3

隨著信創產業的推進&#xff0c;鯤鵬arm64架構得以快速發展。而由于信創領域的主要客戶通常部署在內網環境中&#xff0c;這使得離線部署成為該架構方案實施過程中不可或缺的關鍵環節。 **環境涉及軟件版本信息** 服務器芯片: **鯤鵬920/飛騰2000(arm64)** 操作系統&#xff…

第11章:Neo4j實際應用案例

理論知識和技術細節固然重要&#xff0c;但真正理解Neo4j的價值在于了解它如何解決實際業務問題。本章將探討Neo4j在各個領域的實際應用案例&#xff0c;包括社交網絡分析、推薦系統、知識圖譜以及欺詐檢測與安全分析。通過這些案例&#xff0c;讀者可以了解如何將前面章節學到…

數字圖像處理與OpenCV初探

什么是數字圖像處理&#xff1f; 當今時代&#xff0c;數字圖像無處不在。手機拍照、安防監控、醫療檢查、地圖導航、工業質檢……我們每天都在接收、分析和處理大量圖像信息。對于計算機而言&#xff0c;圖像并不是一張“看得懂”的照片&#xff0c;而是由數值組成的矩陣。如何…

ubuntu網絡連接失敗 + mobaxterm拖拽文件出錯等問題解決方法

網絡連接問題&#xff0c;表現在不能通過源下載以及更新 終端問題顯示【通過 ip a 命令獲得】 kejiubuntu:~/Desktop$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00…

C# CS_Prj01 串口通信控制臺程序

一直以來&#xff0c;玩8088單板機&#xff0c;上位機都是使用的綠色現成的串口軟件。 今天&#xff0c;感覺8088單板機的各部分測試都基本完成了。 本著玩的精神&#xff0c;自己寫一個上位機的簡單串口程序&#xff0c;與自己的8088單板機通訊。 功能&#xff1a;一個完整…

40套精品大氣黑金系列行業PPT模版分享

黑金系列PPT模版&#xff0c;優秀員工頒獎典禮PPT模版&#xff0c;消費訂貨會PPT模版&#xff0c;共贏未來PPT模版&#xff0c;投資類PPT模版&#xff0c;雙12年終盛典PPT模版&#xff0c;商業計劃書PPT模版&#xff0c;高端通用企業文化PPT模版&#xff0c;公司喜報企業捷報PP…

SAP學習筆記 - 開發31 - 前端Fiori開發 Device Adaptation(設備自適應)

上一章講了Fiori開發中的 Responsiveness&#xff08;響應式設計&#xff09;。 SAP學習筆記 - 開發30 - 前端Fiori開發 Responsiveness&#xff08;響應式設計&#xff09;-CSDN博客 本章繼續學習Fiori 開發中的知識。 目錄 1&#xff0c;Device Adaptation&#xff08;設備…

網絡的那些事——初級——OSPF(2)

前面說了OSPF的狀態機和一起簡單的OSPF配合&#xff0c;接下這章繼續寫OSPFV2 IP frr和OSPFV3. 什么是OSPF IP FRR? OSPF IP FRR&#xff08;Fast Reroute&#xff09;利用全網鏈路狀態數據庫&#xff0c;預先計算出備份路徑保存在轉發表中&#xff0c;以備在故障時提供流量保…

C++(初階)(二十一)——unordered_set和unordered_map

二十二&#xff0c;unordered_set和unordered_map的使用 1.unordered_set 1.1介紹 c11 template<class Key,class Hash std::hash<Key>,class KeyEqual std::equal_to<Key>,class Allocator std::allocator<Key> > class unordered_set;c17 na…

Java面試題:分布式ID時鐘回撥怎么處理?序列號耗盡了怎么辦?

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄 引言1 分布式ID2 問題2.1 時鐘回撥2.1.1 毫秒級時…

影視劇學經典系列-梁祝-陶淵明《感士不遇賦并序》

1、背景 《感士不遇賦并序》是東晉詩人陶淵明創作的一篇抒發懷才不遇之慨的辭賦作品。受董仲舒《士不遇賦》和司馬遷《悲士不遇賦》啟發&#xff0c;陶淵明借古喻今&#xff0c;批判“真風告逝&#xff0c;大偽斯興”的亂世。社會批判?以“密網裁而魚駭&#xff0c;宏羅制而鳥…

Spring Cloud Gateway 全面學習指南

Spring Cloud Gateway 全面學習指南 學習目錄 第一部分&#xff1a;基礎概念與核心架構 API網關概述與Spring Cloud Gateway簡介Spring Cloud Gateway核心架構與工作原理Spring Cloud Gateway與Zuul的對比分析Spring Cloud Gateway核心組件詳解 第二部分&#xff1a;基礎配…

蛋白分析工具和數據庫

UniProt&#xff08;Universal Protein Resource&#xff09;是一個綜合性的蛋白質數據庫&#xff0c;提供了全球范圍內已知的蛋白質序列和功能信息。其中&#xff0c;UniProtKB&#xff08;UniProt Knowledgebase&#xff09;是最核心的組成部分&#xff0c;包含了經過注釋和分…

Docker -- 快速入門

鏡像與容器 當我們使用Docker安裝應用時&#xff0c;Docker會自動搜索并下載應用鏡像&#xff08;image&#xff09;。鏡像不僅包含應用本身&#xff0c;還包含應用運行所需要的環境&#xff0c;配置、系統函數庫。Docker會在運行鏡像時創建一個隔離環境&#xff0c;稱為容器&…

輸入數量未知如何設置輸入

在 C 的算法題中&#xff0c;如果你不知道輸入數據有多少組&#xff08;即測試用例的數量未知&#xff09;&#xff0c;通常的處理方式是使用 循環讀取輸入直到文件結束 &#xff08;EOF&#xff09;。這類題目常見于在線評測系統&#xff08;如 LeetCode、牛客網、POJ 等&…