C++基礎學習——文件操作詳解

一、文件流類概述

C++ 標準庫提供了三個主要的文件流類:

  1. ifstream (輸入文件流):用于從文件讀取數據
  2. ofstream (輸出文件流):用于向文件寫入數據
  3. fstream (文件流):既可讀又可寫

這些類都繼承自 iostream 類,因此可以使用 <<>> 操作符進行格式化I/O操作。

二、文件打開與關閉

1. 打開文件

#include <fstream>
using namespace std;// 方法1:先聲明再打開
ofstream outFile;
outFile.open("output.txt");// 方法2:聲明時直接打開
ifstream inFile("input.txt");// 方法3:使用fstream
fstream ioFile;
ioFile.open("data.txt", ios::in | ios::out);

2. 文件打開模式

模式標志描述
ios::in以讀取方式打開
ios::out以寫入方式打開
ios::app追加模式,所有寫入都追加到文件末尾
ios::ate打開文件后定位到文件末尾
ios::trunc如果文件存在則清空內容
ios::binary二進制模式

組合示例:

// 以寫入和追加模式打開
ofstream logFile("log.txt", ios::out | ios::app);// 以讀寫和二進制模式打開
fstream dataFile("data.dat", ios::in | ios::out | ios::binary);

3. 關閉文件

outFile.close();
inFile.close();
ioFile.close();

注意:雖然流對象析構時會自動關閉文件,但顯式關閉是個好習慣。

三、文件狀態檢查

ifstream file("data.txt");if (file.is_open()) {// 文件成功打開
} else {// 文件打開失敗
}// 檢查流狀態
if (file.good()) {// 流狀態良好
}if (file.fail()) {// 操作失敗(非致命錯誤)
}if (file.bad()) {// 嚴重錯誤
}if (file.eof()) {// 到達文件末尾
}

四、文本文件操作

1. 寫入文本文件

ofstream out("output.txt");
if (out.is_open()) {out << "第一行文本" << endl;out << 123 << " " << 3.14 << endl;out << "這是另一行文本" << endl;out.close();
} else {cerr << "無法打開文件!" << endl;
}

2. 讀取文本文件

逐行讀取:
ifstream in("input.txt");
string line;
if (in.is_open()) {while (getline(in, line)) {cout << line << endl;}in.close();
}
逐詞讀取:
ifstream in("input.txt");
string word;
if (in.is_open()) {while (in >> word) {cout << word << endl;}in.close();
}
格式化讀取:
ifstream in("data.txt");
int id;
double value;
string name;if (in.is_open()) {while (in >> id >> value >> name) {cout << "ID: " << id << ", Value: " << value << ", Name: " << name << endl;}in.close();
}

五、二進制文件操作

1. 寫入二進制數據

struct Record {int id;char name[50];double salary;
};Record emp = {101, "John Doe", 4500.50};ofstream out("employees.dat", ios::binary);
if (out.is_open()) {out.write(reinterpret_cast<char*>(&emp), sizeof(Record));out.close();
}

2. 讀取二進制數據

Record emp;
ifstream in("employees.dat", ios::binary);
if (in.is_open()) {in.read(reinterpret_cast<char*>(&emp), sizeof(Record));cout << "ID: " << emp.id << endl;cout << "Name: " << emp.name << endl;cout << "Salary: " << emp.salary << endl;in.close();
}

3. 二進制文件隨機訪問

fstream file("data.dat", ios::in | ios::out | ios::binary);// 寫入多個記錄
Record records[3] = {{101, "Alice", 5000},{102, "Bob", 6000},{103, "Charlie", 7000}
};file.write(reinterpret_cast<char*>(records), 3 * sizeof(Record));// 直接讀取第二個記錄
Record emp;
file.seekg(1 * sizeof(Record), ios::beg);
file.read(reinterpret_cast<char*>(&emp), sizeof(Record));// 修改第三個記錄
emp = {103, "David", 7500};
file.seekp(2 * sizeof(Record), ios::beg);
file.write(reinterpret_cast<char*>(&emp), sizeof(Record));file.close();

六、文件定位

1. 獲取當前位置

streampos pos = file.tellg();  // 獲取讀取位置
streampos pos = file.tellp();  // 獲取寫入位置

2. 設置位置

// 絕對定位
file.seekg(0, ios::beg);  // 移動到文件開頭
file.seekg(0, ios::end);  // 移動到文件末尾// 相對定位
file.seekg(10, ios::cur);  // 從當前位置向前移動10字節
file.seekg(-5, ios::cur);  // 從當前位置向后移動5字節

七、實用文件操作函數

1. 檢查文件是否存在

#include <sys/stat.h>bool fileExists(const string& filename) {struct stat buffer;return (stat(filename.c_str(), &buffer) == 0);
}

2. 獲取文件大小

streampos getFileSize(const string& filename) {ifstream file(filename, ios::ate | ios::binary);return file.tellg();
}

3. 復制文件

bool copyFile(const string& source, const string& dest) {ifstream src(source, ios::binary);ofstream dst(dest, ios::binary);if (!src || !dst) {return false;}dst << src.rdbuf();return true;
}

4. 讀取CSV文件

void readCSV(const string& filename) {ifstream file(filename);string line;while (getline(file, line)) {stringstream ss(line);string cell;vector<string> row;while (getline(ss, cell, ',')) {row.push_back(cell);}// 處理行數據for (const auto& val : row) {cout << val << "\t";}cout << endl;}
}

八、錯誤處理最佳實踐

void processFile(const string& filename) {ifstream file(filename);if (!file) {cerr << "錯誤:無法打開文件 " << filename << endl;perror("原因");  // 打印系統錯誤信息return;}try {// 文件處理代碼string line;while (getline(file, line)) {// 處理每一行}if (file.bad()) {throw runtime_error("讀取文件時發生嚴重錯誤");}if (file.fail() && !file.eof()) {throw runtime_error("文件格式錯誤");}} catch (const exception& e) {cerr << "錯誤: " << e.what() << endl;file.close();return;}file.close();
}

九、性能考慮

  1. 緩沖區大小:默認緩沖區大小可能不適合大文件操作,可以自定義:

    char buffer[8192];  // 8KB緩沖區
    ifstream file;
    file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
    file.open("largefile.dat");
    
  2. 二進制 vs 文本:二進制操作通常比文本操作更快,特別是對于大量數據。

  3. 內存映射文件:對于極大文件,考慮使用操作系統特定的內存映射文件API。

十、C++17 文件系統庫

C++17 引入了 <filesystem> 庫,提供了更高級的文件操作:

#include <filesystem>
namespace fs = std::filesystem;// 檢查文件是否存在
if (fs::exists("test.txt")) {// 獲取文件大小auto size = fs::file_size("test.txt");// 復制文件fs::copy("source.txt", "destination.txt");// 刪除文件fs::remove("old_file.txt");// 遍歷目錄for (auto& entry : fs::directory_iterator(".")) {cout << entry.path() << endl;}
}

通過掌握這些文件操作技術,您可以在C++程序中高效地處理各種文件I/O任務。

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

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

相關文章

Android補全計劃 DrawerLayout使用

DrawerLayout其實用了很久了&#xff0c;甚至封裝了一些代碼方便不同項目使用&#xff0c;但重構代碼的時候突然意識到這塊內容很不成體系&#xff0c;因此又參考了些文檔&#xff0c;組建了自己的一個文檔。 toolbardrawerlayout能寫的效果很多&#xff0c;在此我也只是截取了…

人工智能之數學基礎:概率論之韋恩圖的應用

韋恩圖的應用由于事件的計算有時候太過于抽象了&#xff0c;此時我們可以使用韋恩圖的方式來進行驗證&#xff0c;我們下面來舉一個例子&#xff0c;A∪B&#xff09;-CA∪(B-C)是否成立&#xff1f;我們可以通過韋恩圖來完成這個任務&#xff1a;我們通過這種方式來一點一點的…

小白成長之路-部署Zabbix7(二)

文章目錄一、zabbix-自動發現二、自動注冊三、zabbix-網易云郵箱-發送消息二、zabbix-釘釘告警總結一、zabbix-自動發現 1.在準備兩臺虛擬機&#xff0c;我的是192.168.144.12,192.168.144.13 server換成zabbix服務器的ip地址 vim /etc/zabbix/zabbix_agentd.conf 2.創建自動…

CMU15445-2024fall-project4踩坑經歷

project4目錄Task1Task2ReconstructSeqScanTask3InsertCommitTxnMgrDbgGenerateNewUndoLog And GenerateUpdateUndoLogUpdate And Delete垃圾回收Task4Index Insert并發控制Index ScanDelete、Update并發控制主鍵更新Bonus 1Bonus 2處理寫傾斜感謝CMU的教授們給我們分享了如此精…

C++20 協程

摘要&#xff1a;C20 引入的協程機制為異步編程提供了輕量級解決方案&#xff0c;其核心優勢在于通過用戶態調度實現高效的上下文切換&#xff0c;適用于 I/O 密集型任務、生成器模式等場景。本文系統闡述 C20 協程的底層原理與實踐要點&#xff0c;首先解析協程的基本結構&…

《計算機組成原理與匯編語言程序設計》實驗報告二 基本數字邏輯及漢字顯示

目 錄 一、實驗學時 二、實驗目的 三、實驗要求 四、實驗內容 五、實驗步驟 1、打開Logisim軟件&#xff0c;列出并行四位二進制全加器邏輯電路真值表&#xff0c;并使用與、或、非、異或等基本原件實現并行四位二進制全加器邏輯電路&#xff0c;鋪設完成后進行測試進而…

問卷調查小程序的設計與實現

問卷調查小程序的設計與實現&#xff1a;技術與功能全解析在數字化時代&#xff0c;問卷調查成為數據收集的重要工具。一款高效、易用的問卷調查小程序能夠顯著提升用戶體驗和數據質量。本文將深入探討基于現代技術棧的問卷調查小程序的設計與實現&#xff0c;涵蓋核心功能、技…

STM32項目實戰:正弦波

波形發生器對我的錢包不怎么友好&#xff0c;手里面有stm32f103c8t6&#xff0c;于是就想,放在哪兒吃灰也是吃灰&#xff0c;不如做個正弦波發生器。方案 dac沒怎么用過&#xff0c;所以打算使用輸出模擬正弦波。我們決定采用以下方案&#xff1a;1.使用TIM2_CH3&#xff08;PA…

Unity 時間抗鋸齒(Temporal Antialiasing, TAA)技術解析

時間抗鋸齒&#xff08;Temporal Antialiasing, TAA&#xff09;技術解析 一、什么是時間抗鋸齒&#xff08;TAA&#xff09;&#xff1f; 時間抗鋸齒&#xff08;TAA&#xff09;是一種先進的實時抗鋸齒技術&#xff0c;通過在時間維度上積累多幀渲染數據&#xff0c;實現比傳…

uniapp打開導航軟件并定位到目標位置的實現

/*** 打開導航* param location 經緯度(例如&#xff1a;"117.214713,39.116884")* param address 地址*/ export function mapNavigation(location, address) {const locationArr location.split(,)const longitude locationArr[0]const latitude locationArr[1]…

Mysql實現高可用(主從、集群)

一、背景 需求&#xff1a;客戶要實現Mysql8.0高可用&#xff0c;出現故障時&#xff0c;需要實現自動切換。 分析&#xff1a;實現切換有兩種方式&#xff0c;一種數據庫自動切換&#xff0c;一種代碼實現。 本著麻煩別人&#xff0c;別麻煩自己的原則&#xff0c;得給客戶的D…

AI編程革命:自動化代碼生成、低代碼開發與智能優化實踐全景解析

AI編程革命&#xff1a;自動化代碼生成、低代碼開發與智能優化實踐全景解析 人工智能正在重塑軟件開發的基本范式&#xff0c;從自動化代碼生成到低代碼開發平臺&#xff0c;再到算法智能優化&#xff0c;AI編程技術正以指數級速度改變開發者工作方式。 一、自動化代碼生成技術…

[實戰] 用1 PPS 馴服本地恒溫晶振(OCXO/TCXO)

1 PPS 馴服本地恒溫晶振&#xff08;OCXO/TCXO&#xff09; “讓任何工程師都能在一周內做出自己的 GPSDO” 文章目錄1 PPS 馴服本地恒溫晶振&#xff08;OCXO/TCXO&#xff09;前言1 系統總體框圖2 硬件清單與連接3 時間間隔測量&#xff08;TDC&#xff09;原理4 數字鎖相環算…

基于RK3576+FPGA的無人機飛控系統解決方案

基于RK3576FPGA的無人機飛控系統解決方案設計如下&#xff1a;一、硬件架構設計?異構計算核心模塊?主控采用RK3576處理器&#xff0c;四核Cortex-A72&#xff08;2.3GHz&#xff09;運行路徑規劃算法&#xff08;A*、RRT*&#xff09;&#xff0c;支持動態避障響應時間<50…

2025暑期—05神經網絡-卷積神經網絡

1. 卷積神經網絡實際上就是避免過擬合&#xff0c;就是“特征”神經網絡。這個特征和卷積核相關。卷積和相關類似&#xff0c;有點是本質屬性和輸出屬性的感覺。著重注意三通道卷積padding 上下左右、前后都要加邊池化就是解決特征過多問題&#xff0c;縮小1倍較多。均值池化&a…

Elasticsearch部署全攻略:編譯安裝與 Yum 安裝實踐,日志切割及報錯處理

前言&#xff1a;在 Linux 運維工作中&#xff0c;Elasticsearch 的部署與運維是高頻需求——無論是快速搭建測試環境還是構建生產級集群&#xff0c;選擇合適的安裝方式&#xff08;編譯安裝或 Yum 安裝&#xff09;直接影響后續維護效率。同時&#xff0c;日志的合理切割能避…

TypeScript 配置參數詳解 (tsconfig.json)

文章目錄前言核心配置基本選項嚴格類型檢查選項模塊解析選項Source Map 選項實驗性選項其他選項文件包含/排除選項詳細用法示例最佳實踐建議前言 tsconfig.json 是 TypeScript 項目的配置文件&#xff0c;用于指定編譯選項和文件包含規則。以下是所有主要配置參數的中文詳解&a…

Java經典筆試題

1.計算機網絡傳輸層有哪些協議&#xff1f;分別適用于什么場景&#xff1f; TCP&#xff1a;面向連接、可靠傳輸&#xff08;重傳機制&#xff09;&#xff0c;適用于對數據完整性要求高的場景&#xff0c;如文件傳輸 &#xff08;FTP&#xff09;、HTTP 通信、郵件發送&…

如何序列化和反序列化動態 XmlElement ?

有如下XML&#xff0c;Index_0-Index_N為動態的&#xff0c;N為可變數&#xff0c;如何將對象NoneXML序列化為XML&#xff0c;以及如何將XML內容反序列化為對象NoneXML&#xff1f;1、XML內容<NoneXML><Index_0><UseInSummary>0</UseInSummary><Beg…

分布式高可用ELK平臺搭建及使用保姆級教程指南 (附安裝包網盤免費下載)

1 ELK 簡介 1.1 ELK 是什么 ? ELK是一套開源免費且功能強大的日志分析管理系統,由 Elasticsearch、Logstash、Kibana 三部分組成,是三個軟件產品的首字母縮寫,簡稱ELK。這三款軟件都是開源軟件,通常是配合使用,且歸于 Elastic.co 公司名下,所以被簡稱為 ELK。 ? ELK…