C++11QT復習 (三)

文章目錄

    • @[toc]
    • Day5-2 文件IO(2025.03.24)
      • 1. 緩沖區與刷新
        • 1.1 常見的緩沖刷新方式
      • 2. 文件讀寫操作
        • 2.1 讀取文件
        • 2.2 寫入文件
        • 2.3 追加模式寫入
        • 2.3 完整代碼
      • 3. 文件定位操作
      • 4. 字符串IO
      • 5. 配置文件解析示例
      • 6. 完整代碼
      • 7. 二進制文件操作
      • 總結

Day5-2 文件IO(2025.03.24)

1. 緩沖區與刷新

在C++的標準輸入輸出流 (iostream) 中,I/O 操作通常會涉及緩沖區,以提高效率。默認情況下,cout 采用緩沖模式,輸出內容會暫存到緩沖區,只有在緩沖區滿了或遇到某些特殊情況(如換行)時,數據才會被刷新到屏幕。

1.1 常見的緩沖刷新方式
方法作用例子
cout << endl;輸出換行并刷新緩沖區cout << "Hello" << endl;
cout << flush;只刷新緩沖區,但不換行cout << "Hello" << flush;
cout << ends;在緩沖區加入一個空字符(\0),但不會刷新cout << "Hello" << ends;
#include <iostream>
#include <thread>
#include <chrono>using namespace std;void test()
{for (size_t i = 0; i < 1024; i++){cout << "a";}cout << 'b' << endl; // 刷新緩沖區并換行cout << "c" << flush; // 只刷新,不換行cout << "d" << ends;  // 只插入空字符,不刷新this_thread::sleep_for(chrono::seconds(5));
}int main()
{test();return 0;
}

2. 文件讀寫操作

C++標準庫提供了 <fstream> 頭文件,其中包含三個主要的文件流類:

類名作用
ifstream讀文件(input file stream)
ofstream寫文件(output file stream)
fstream讀寫文件(file stream)
2.1 讀取文件
#include <iostream>
#include <fstream>
#include <string>using namespace std;void readFile()
{ifstream ifs("test.txt"); // 打開文件if (!ifs.is_open()){cerr << "文件打開失敗" << endl;return;}string line;while (getline(ifs, line)){cout << line << endl;}ifs.close(); // 關閉文件
}int main()
{readFile();return 0;
}
2.2 寫入文件
void writeFile()
{ofstream ofs("output.txt");if (!ofs){cerr << "文件打開失敗" << endl;return;}ofs << "Hello, world!" << endl;ofs.close();
}
2.3 追加模式寫入

使用 ios::app 選項可以在文件末尾追加內容,而不會覆蓋原有數據。

void appendToFile()
{ofstream ofs("log.txt", ios::app);if (!ofs){cerr << "文件打開失敗" << endl;return;}ofs << "新日志記錄" << endl;ofs.close();
}
2.3 完整代碼
#include <iostream>
#include <fstream>
#include <string>
#include <vector>using namespace std;void test()
{ifstream ifs("test.txt");if (!ifs.good()){cout << "文件打開失敗" << endl;return;}//文件流讀文件//對于文件輸入流而言,默認以空格作為分隔符string line;while (ifs >> line)//cin >> line{cout << line << endl;}
}void test2()
{ifstream ifs("test.txt");if (!ifs.good()){cout << "文件打開失敗" << endl;return;}//文件流讀文件//對于文件輸入流而言,默認以空格作為分隔符string line;while (getline(ifs,line)){cout << line << endl;}
}//打印前幾行的內容
void test3()
{ifstream ifs("test.txt");if (!ifs.good()){cout << "文件打開失敗" << endl;return;}//文件流讀文件//對于文件輸入流而言,默認以空格作為分隔符string line;int lineNum = 0;while (getline(ifs, line)){cout << line << endl;lineNum++;if (lineNum == 5){break;}}
}//打印指定行的內容
void test4()
{string fileName = "test.txt";ifstream ifs(fileName);if (!ifs.good()){cout << "文件打開失敗" << endl;return;}//文件流讀文件//對于文件輸入流而言,默認以空格作為分隔符string line[120];size_t lineNum = 0;vector<string> vec;while (getline(ifs, line[lineNum])){++lineNum;}cout << "line[22] = " << line[22] << endl;
}void test5()
{string fileName = "test.txt";ifstream ifs(fileName);if (!ifs.good()){cout << "文件打開失敗" << endl;return;}//文件流讀文件//對于文件輸入流而言,默認以空格作為分隔符string line;vector<string> vec;while (getline(ifs, line)){vec.push_back(line);}cout << "vec[22] = " << vec[22] << endl;
}void test6()
{ifstream ifs("test.txt");if (!ifs.good()){cerr << "ifstream is not good!" << endl;return;}ofstream ofs("wd.txt");if (!ofs.good()){cerr << "ofstream is not good!" << endl;ifs.close();//在程序異常退出時,關閉前面的ifsreturn;}string line;while (getline(ifs, line)){ofs << line << endl;}ifs.close();ofs.close();
}void test7()
{//對于文件的輸出輸出流而言,當文件不存在的時候就打開失敗fstream fs("wenchang.txt");if (!fs.good()){cerr << "fstream is not good!" << endl;return;}//業務邏輯//通過鍵盤輸入數據,使用fs進行讀文件,隨后輸出到屏幕int number = 0;cout << "請輸入5次數字: " << endl;for (size_t idx = 0; idx != 5; ++idx){cin >> number;fs << number << " ";}size_t len = fs.tellp();cout << "len= " << len << endl;fs.seekp(0);len = fs.tellp();cout << "len= " << len << endl;for (size_t idx = 0; idx != 5; ++idx){cout << "fs.failbit = " << fs.fail() << endl<< "fs.eofbit = " << fs.eof() << endl<< "fs.goodbit = " << fs.good() << endl;fs >> number;cout << number << " ";}cout << endl;fs.close();
}//追加模式
void test8()
{ifstream ifs("test.txt", std::ios::in | std::ios::ate);if (!ifs.good()){cerr << "ifstream is not good!" << endl;return;}cout << "ifs.tellg() = " << ifs.tellg() << endl;ifs.close();
}void test9()
{ofstream ofs("wenchang.txt",std::ios::out | std::ios::app);if (!ofs.good()){cerr << "ofstream is not good!" << endl;return;}cout << "ofs.tellg() = " << ofs.tellp() << endl;ofs.close();
}int main(int argc, char* argv[])
{	//test();//test5(); //讀取文件內容到vector容器中test9();return 0;
}

3. 文件定位操作

文件流支持 seekg()(get)和 seekp()(put)來定位文件指針。

void filePositioning()
{fstream fs("test.txt", ios::in | ios::out);if (!fs){cerr << "文件打開失敗" << endl;return;}fs.seekg(0, ios::end); // 移動到文件末尾cout << "文件大小: " << fs.tellg() << " 字節" << endl;fs.close();
}

4. 字符串IO

C++ 提供了 stringstream 以便在字符串中進行 I/O 操作。

#include <sstream>void stringStreamDemo()
{stringstream ss;int num = 42;ss << "數字: " << num;string output = ss.str();cout << output << endl;
}

5. 配置文件解析示例

void readConfig(const string& filename)
{ifstream ifs(filename);if (!ifs){cerr << "打開文件失敗: " << filename << endl;return;}string line;while (getline(ifs, line)){istringstream iss(line);string key, value;iss >> key >> value;cout << key << " -> " << value << endl;}ifs.close();
}

6. 完整代碼

#include <iostream>
#include <sstream>
#include <fstream> // 添加此行以包含 ifstream 的定義using namespace std;
using std::ostringstream;
using std::istringstream;
using std::stringstream;string int2string(int value)
{ostringstream oss;//中轉oss << value;return oss.str();//獲取底層的字符串
}void  test()
{int number = 10;string s1 = int2string(number);cout << "s1 = " << s1 << endl;
}void test2()
{int number1 = 10;int number2 = 20;stringstream ss;ss << "number1 = " << number1<< "number2 = " << number2;string s1 = ss.str();cout << "s1 =" <<  s1 << endl;string key;string value;while (ss >> key >> value){cout << key << "--->" << value << endl;}}void readConfig(const string& filename)
{ifstream ifs(filename);if (!ifs){cerr << "open" << filename << "error!" << endl;return;}string line;while (getline(ifs, line)){istringstream iss(line);string key, value;iss >> key >> value;cout << key << "  " << value << endl;}ifs.close();
}void test3()
{readConfig("my.conf");
}int main()
{test3();return 0;
}

7. 二進制文件操作

#include <iostream>
#include <fstream>
using namespace std;struct Data {int id;double value;
};// 寫入二進制文件
void writeBinaryFile(const string &filename)
{ofstream ofs(filename, ios::binary);if (!ofs){cerr << "文件打開失敗!" << endl;return;}Data d = {1, 3.14};ofs.write(reinterpret_cast<const char *>(&d), sizeof(d));ofs.close();
}// 讀取二進制文件
void readBinaryFile(const string &filename)
{ifstream ifs(filename, ios::binary);if (!ifs){cerr << "文件打開失敗!" << endl;return;}Data d;ifs.read(reinterpret_cast<char *>(&d), sizeof(d));cout << "id: " << d.id << ", value: " << d.value << endl;ifs.close();
}int main()
{string filename = "data.bin";writeBinaryFile(filename);readBinaryFile(filename);return 0;
}

總結

  1. 文本文件
    • ifstream 讀取文件,ofstream 寫入文件,fstream 讀寫文件。
    • seekg()seekp() 控制文件指針。
    • stringstream 適用于字符串的 I/O 操作。
    • ios::app 可用于追加模式寫入文件。
  2. 二進制文件
    • 讀寫方式:ifstreamofstream 需使用 ios::binary 模式
    • 讀取方式:read()write()
    • 適用于存儲結構化數據,如 struct 類型的存儲和讀取。

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

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

相關文章

Redis Sentinel 詳解

Redis Sentinel 詳解 1. 什么是 Redis Sentinel&#xff1f;有什么用&#xff1f; Redis Sentinel&#xff08;哨兵&#xff09; 是 Redis 官方提供的高可用性解決方案&#xff0c;主要用于監控、通知和自動故障轉移。當 Redis 主節點&#xff08;master&#xff09;發生故障…

AI日報 - 2025年3月25日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Nebula&#xff08;Google Gemini 2.0 Pro&#xff09;破解復雜數學謎題 編碼與推理能力再上新臺階 ▎&#x1f4bc; 商業動向 | Sesame AI開源10億參數語音模型CSM-1B 語音AI進入普惠時代 …

AI醫療革命:英偉達GTC 2025醫療健康與生命科學會議全分析

AI醫療革命:英偉達GTC 2025醫療健康與生命科學會議全分析 一、GTC 2025:AI 醫療的算力與生態雙突破 1.1 黃仁勛演講核心:從訓練到推理的代際跨越 在科技界矚目的英偉達 GTC 2025 大會上,英偉達 CEO 黃仁勛的主題演講成為全場焦點,為 AI 醫療領域帶來了極具變革性的消息。…

【機器學習/大模型/八股文 面經 (一)】

1. PPO算法中使用GAE的好處以及參數γ和λ的作用是什么? 參考答案: GAE(Generalized Advantage Estimation) 的優勢在于通過指數加權多步TD誤差,平衡優勢估計的偏差與方差,提升策略優化的穩定性。γ(折扣因子):控制未來獎勵的衰減程度,值越大表示更關注長期收益。λ…

03 Python 基礎:數據類型、運算符與流程控制解析

文章目錄 一、數據類型 內置的六大類數字類型整數類型 int浮點數 float布爾 bool字符串 str 變量命名 二、數字類型的相互轉換顯式類型的轉換整數&#xff0c;浮點數&#xff0c;復數 之間的顯式轉換 隱式類型的轉換 三、標識符算術運算符比較運算符邏輯運算符位運算符賦值運算…

視頻知識庫初步設想

將視頻字幕提取出來作為知識庫來源定位,下一步設想:把視頻上的圖片信息也精簡出來作為定位。 下面是測試例子: 入參: {"model":"deepseek-ai/DeepSeek-R1-Distill-Llama-8B","messages":[{"role":"system","cont…

數據庫原理13

1.關系模式設計不當引起的問題&#xff1a;數據冗余&#xff1b;更新異常&#xff1b;插入異常&#xff1b;刪除異常 2.外碼可以是單個屬性&#xff0c;也可以是屬性組 3.動態SQL是SQL標準提供的一種語句運行機制 4.若一個模式分解保持函數依賴&#xff0c;則該分解一定具有…

初級:異常處理面試題深度解析

一、引言 在Java開發中&#xff0c;異常處理是確保程序健壯性和穩定性的重要機制。面試官通過相關問題考察候選人對異常處理的理解和運用能力&#xff0c;以及在實際開發中處理異常的經驗。本文將深入剖析常見的異常處理面試題&#xff0c;結合實際開發場景&#xff0c;幫助讀…

Apache Spark - 用于大規模數據分析的統一引擎

Apache Spark - 用于大規模數據分析的統一引擎 下載運行示例和 Shell使用 Spark Connect 在 Anywhere 上運行 Spark 客戶端應用程序 在集群上啟動從這里去哪里使用 Spark Shell 進行交互式分析基本有關數據集作的更多信息緩存 自包含應用程序從這里去哪里 Apache Spark 是用于大…

餐飲管理系統的設計與實現(代碼+數據庫+LW)

摘 要 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。針對信息管理混亂&#xff0c;出錯率高&#xff0c;信息安全性差&#…

【C#】Winform調用NModbus實現Modbus TCP 主站通訊

一、前言 Modbus是一種串行通信協議&#xff0c;是工業領域全球最流行的協議之一。 1.1 環境 系統&#xff1a;Win11 工具&#xff1a;Visual Studio 2022 .Net 版本&#xff1a;.Net Framework4.6.0 依賴庫&#xff1a;NModbus 3.0.81 1.2 協議類型 Modbus RTU&#xff1a;一…

【leetcode題解】貪心算法

目錄 貪心算法 檸檬水找零 將數組和減半的最少操作次數 最大數 擺動序列 最長遞增子序列 遞增的三元子序列 最長連續遞增序列 買賣股票的最佳時機 買賣股票的最佳時機 II K 次取反后最大化的數組和 按身高排序 優勢洗牌 最長回文串 增減字符串匹配 分發餅干 最…

Langchain4J框架相關面試題

以下是關于Langchain4J框架的面試題目及答案 ### Langchain4J基礎概念類 1. **Langchain4J框架是什么&#xff1f;它的核心功能有哪些&#xff1f;** Langchain4J是一個用于構建語言模型應用的Java框架&#xff0c;它為開發者提供了一套簡潔高效的API&#xff0c;使得在Jav…

Apache Doris

Apache Doris介紹 Apache Doris 是一個基于 MPP 架構的高性能、實時的分析型數據庫&#xff0c;以極速易用的特點被人們所熟知&#xff0c;僅需亞秒級響應時間即可返回海量數據下的查詢結果&#xff0c;不僅可以支持高并發的點查詢場景&#xff0c;也能支持高吞吐的復雜分析場…

VLAN間通信

目錄 第一步&#xff1a;配vlan 第二步&#xff1a;配置核心vlanif,MAC地址信息。 第三步&#xff1a;ospf協議 三層交換機&#xff08;匯聚層&#xff09;: 對于交換機、路由器、防火墻等網絡設備而言&#xff0c;接口類型一般存在兩種&#xff1a;二層接口&#xff0c;三…

LeetCode熱題100精講——Top2:字母異位詞分組【哈希】

你好&#xff0c;我是安然無虞。 文章目錄 題目背景字母異位詞分組C解法Python解法 題目背景 如果大家對于 哈希 類型的概念并不熟悉, 可以先看我之前為此專門寫的算法詳解: 藍橋杯算法競賽系列第九章巧解哈希題&#xff0c;用這3種數據類型足矣 字母異位詞分組 題目鏈接&am…

基于python+django的圖書借閱網站-圖書借閱管理系統源碼+運行步驟

該系統是基于pythondjango開發的在線圖書借閱管理系統。系統適合場景&#xff1a;大學生、課程作業、系統設計、畢業設計。 演示地址 前臺地址&#xff1a; http://book.gitapp.cn 后臺地址&#xff1a;http://book.gitapp.cn/#/admin 后臺管理帳號&#xff1a; 用戶名&…

uni-app集成保利威直播、點播SDK經驗FQ(二)|小程序直播/APP直播開發適用

通過uniapp集成保利威直播、點播SDK來開發小程序/APP的視頻直播能力&#xff0c;在實際開發中可能會遇到的疑問和解決方案&#xff0c;下篇。更多疑問請咨詢19924784795。 1.ios不能后臺掛起uniapp插件 ios端使用后臺音頻播放和畫中畫功能&#xff0c;沒有在 manifest.json 進…

數據庫三級填空+應用題(1)

填空 35【答案】TOP 3 WITH TIES 【解析】希望選出商品數量最多的前3類商品&#xff0c;并獲得相應的商品類別和數量。with ties一般是和Top 、 order by相結合使用,表示包括與最后一行order by后面的參數取值并列的結果。 36在SQL Server 2008中&#xff0c;每個數據頁可存儲8…

前端(vue)學習筆記(CLASS 5):自定義指令插槽路由

1、自定義指令 內置指令&#xff1a;內部提供的&#xff0c;每個指令都有自己各自獨立的功能 自定義指令&#xff1a;自己定義的指令&#xff0c;可以封裝一些dom操作&#xff0c;擴展額外功能 全局注冊-語法 例如&#xff0c;當頁面加載時&#xff0c;讓元素獲得焦點 Vue.…