IO流與單例模式

單例模式

單例模式是指一個類只能有一個對象。

餓漢模式

在單例模式下,在程序開始(main函數運行前)的時候創建一個對象,這之后就不能再創建這個對象。

class HungryMan
{
public:static HungryMan* getinstance(){return &inst;}
private:HungryMan(){}HungryMan(const HungryMan& it) = delete;const HungryMan& operator=(const HungryMan& it) = delete;static HungryMan inst;//這里是聲明,并不是定義,所以可以在類里面包含//實際上是全局變量與類封裝融合的結果
};HungryMan HungryMan::inst;//在類外定義

餓漢模式的實現方式較為簡單,但存在線程安全(如果沒加鎖,可能會出現new了幾個單例對象出來),可能導致進程啟動慢(main函數啟動之前需要創建對象),無法控制單例的初始化順序(如果不同的單例模式在不同的文件,就無法確認初始化順序,包括單例之間有可能存在依賴,也可能存在問題)的問題。

懶漢模式

在第一次使用的時候創建。

class LazyMan
{
public:static LazyMan* getinstance(){if (inst == nullptr){inst = new LazyMan();//new出來的數據是需要釋放的,但懶漢對象大部分不需要手動釋放//但這個對象并不是在程序層面上釋放的,而是在系統回收資源的時候釋放的//那如果我們需要保存一些數據的話,要保證main函數之后要自動調用懶漢類的析構函數}return inst;}static void delinstance(){if (inst == nullptr){delete inst;inst=nullptr;}}private:LazyMan(){}LazyMan(const LazyMan& it) = delete;const LazyMan& operator=(const LazyMan& it) = delete;static LazyMan* inst;class gc{~gc(){delinstance();}};static gc delgc;
};LazyMan* LazyMan::inst = nullptr;LazyMan::gc LazyMan::delgc;

IO流

c++的IO流

C++系統實現了一個龐大的類庫,其中ios為基類,其他類都是直接或間接派生自ios類,c++這個IO流實際上是和C語言保持一致的,比如說istream對標的就是scanf和printf,fstream對標的是fscanf和fprintf,sstream對標的是sscanf和sprintf。
在這里插入圖片描述
在類型轉換中,對于內置類型,相近的類型可以互相轉換,其他的可以由構造函數來支持轉換,就像自定義類型可以轉化為自定義類型,內置類型也可以轉換為自定義類型,自定義類型也可以轉化為自定義類型。

class tmp
{
public:operator int(){if(/*輸入為ctrl+z*/){return 0;}else{return /*非0*/}}
};int main()
{tmp t;int i = t;return 0;
}

標準讀寫

所以cin可以直接使用while(cin>>tmp),當輸入其他字符,返回值就為真,如果輸入ctrl+z,返回值就是假,循環就退出了。
c++默認是兼容C語言的,當c++的cin和C語言的scanf混用的時候,并不會因為緩沖區的問題而導致讀取混亂,如果想關掉這種兼容,可以調用下圖的函數。

cin.sync_with_stdio(false);
cout.sync_with_stdio(false);

在這里插入圖片描述

文件讀寫

在C語言中,fgetc和fputc是用來讀單個字符的,fread和fwrite是用來讀寫文件的,fprintf和fscanf是用來格式化讀寫的,但這些只能用來對內置類型做操作,在c++里,ifstream是從文件里讀,ofstream是寫到文件里,可以應付內置類型和自定義類型的輸入和輸出。
二進制讀寫:如果要把內存中的數據存到磁盤里,內存中的數據是由類型的,而磁盤沒有,我們可以使用二進制讀寫,也可以使用文本讀寫。比如說我們要把一個結構體按二進制的形式寫到磁盤里:
在這里插入圖片描述

class A
{
private:int a;char b;string c;
};class Bin
{
public:Bin(const char* filename="./info.bin"):_filename(filename){}void Write(){ofstream ofs(_filename, ios_base::out | ios_base::binary);A data;ofs.write((const char*)&data, sizeof(data));}void Read(A & rA){ifstream ifs(_filename, ios_base::in | ios_base::binary);ifs.read((char*)&rA, sizeof(rA));}private:string _filename;
};

在這里插入圖片描述
我們可以用read再次讀取,但這樣是把數據原封不動的讀回來,包括地址,但這樣在同一個進程就會發生淺拷貝問題,析構兩次,而如果是不同的進程讀取,就會出現野指針問題,因為到后來的進程讀取的時候,前面進程的空間早就銷毀了,根據文件拷貝回來的地址就是一個野指針,所以只要是容器都要注意不能用二進制進行讀取,因為容器底層都相對復雜。
文本讀寫:如果要正常讀寫到文件里和從文件里讀出來,都要和字符串相互轉化。但這樣轉化太麻煩,所以在C語言中,我們可以使用sscanf和sprintf轉化完后用fwrite和fread寫到文件里和讀取。而在c++中重載了流插入和流提取,所以也不需要自己去做轉換。

class Text
{
public:Text(const char* filename = "./info.text"):_filename(filename){}void Read(A& rA){ifstream ifs(_filename);ifs >> rA._a >> rA._b >> rA._c;}void Write(){A data(1, 'a', "hello world");ofstream ofs(_filename);ofs << data._a;ofs << data._b;ofs << data._c;//可以使用getline}
private:string _filename;
};

stringstream

自定義類型不方便轉為字符串,所以可以調用stringstream。

class A
{
public:A(int a=0,char b='\0', string c=""):_a(a),_b(b),_c(c){}int _a;char _b;string _c;
};ostream& operator << (ostream & os, A aa)//必要手動寫格式
{os << aa._a << '/' << aa._b << '/' << aa._c;return os;
}int main()
{A tmp(20, 'a', "hello world");ostringstream oss;oss << tmp;string out = oss.str();cout << out << endl;return 0;
}

在這里插入圖片描述
但stringstream并不會用于比較復雜的情景,比較復雜的情景可以使用json。

class Date
{
public:Date(int _year,int _month,int _day):year(_year),month(_month),day(_day){}int year;int month;int day;
};
istream& operator>>(istream& is, Date& d)
{is >> d.year >> d.month >> d.day;return is;
}ostream& operator<<(ostream& os, Date& d)
{os << d.year <<' ' << d.month<<' ' << d.day << ' ';return os;
}
class Parent
{
public:Parent(int a1,char b1,Date c1):a(a1),b(b1),c(c1){}int a;char b;Date c;
};ostream& operator<<(ostream& os, Parent& p)
{os << p.a <<' ' << p.b<<' ' << p.c << ' ';return os;
}istream& operator>>(istream& is, Parent& p)
{is >> p.a >> p.b >> p.c;return is;
}int main()
{Date d1(2025, 8, 16);Parent p1(10, 'a', d1);ostringstream os;os << p1;Date d2(2024, 9, 18);Parent p2(20, 'b', d2);istringstream is(os.str());is >> p2;return 0;
}

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

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

相關文章

Java設計模式之依賴倒置原則使用舉例說明

示例1&#xff1a;司機駕駛汽車 問題場景&#xff1a;司機類直接依賴奔馳車類&#xff0c;新增寶馬車需修改司機類代碼。 // 未遵循DIP class Benz { public void run() { /*...*/ } } class Driver { public void drive(Benz benz) { benz.run(); } } // 遵循DIP&#xff1a;…

【Docker】openEuler 使用docker-compose部署gitlab-ce

docker-compose配置 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlab.example.comenvironment:GITLAB_OMNIBUS_CONFIG: |# Add any other gitlab.rb configuration here, each on its own lineexternal_url https://gi…

ElasticSearch 父子文檔使用簡記

一. ES parent-child 文檔簡介 ES 提供了類似數據庫中 Join 聯結的實現&#xff0c;可以通過 Join 類型的字段維護父子關系的數據&#xff0c;其父文檔和子文檔可以單獨維護。 二. 父子文檔的索引創建與數據插入 ES 父子文檔的創建可以分為下面三步&#xff1a; 創建索引 M…

【Linux】編輯器vim的使用

目錄 1. vim的基本概念 2. vim的基本使用 3. vim命令模式操作 3.1 移動光標 3.2 刪除 3.3 復制 3.4 替換 3.5 撤銷 3.6 更改 3.7 跳轉 4. vim底行模式操作 4.1 列出行號 4.2 跳到文件中的某行 4.3 查找字符 4.4 保存文件 4.5 離開vim 1. vim的基本概念 Vim&…

《零基礎掌握飛算Java AI:核心概念與案例解析》

前引&#xff1a;飛算科技是一家專注于企業級智能化技術服務的公司&#xff0c;核心領域包括AI、大數據、云計算等。其Java AI解決方案主要面向企業級應用開發&#xff0c;提供從數據處理到模型部署的全流程支持&#xff01;飛算Java AI是一款基于人工智能技術的Java開發輔助工…

Chrome騰訊翻譯插件transmart的安裝

文章目錄一、官網地址二、安裝過程1. 下載插件2. 解壓crx3, chrome安裝三、如何使用一、官網地址 騰訊翻譯插件官網 二、安裝過程 1. 下載插件 點擊上面的官網地址&#xff0c;下拉到如圖所示chrome插件位置&#xff0c;點擊立即下載 2. 解壓crx 從壓縮文件中解壓出crx文…

IOMMU的2級地址翻譯機制及多級(2~5)頁表查找

IOMMU的2級地址翻譯機制及多級(2~5)頁表查找 摘要:IOMMU是現代計算機系統中用于I/O設備(如GPU、NIC、網絡接口卡)的地址翻譯和保護機制,類似于CPU的MMU(Memory Management Unit),但專為設備DMA(Direct Memory Access,直接內存訪問)設計。它支持虛擬化環境(…

C++STL標準模板庫詳解

一、引言STL&#xff08;Standard Template Library&#xff09;是 C 標準庫的核心組成部分&#xff0c;其中容器&#xff08;Containers&#xff09; 作為數據存儲的基礎組件&#xff0c;為開發者提供了豐富的數據結構選擇。本文將聚焦 STL 容器的核心類型&#xff0c;結合具體…

神經網絡 常見分類

&#x1f4da; 神經網絡的常見分類方式可以從不同角度來劃分&#xff0c;以下是幾種主流思路&#xff0c;幫你快速梳理清晰&#xff1a;1?? 按網絡結構分類前饋神經網絡&#xff08;Feedforward Neural Network, FNN&#xff09; 數據從輸入層→隱藏層→輸出層單向傳遞&#…

生產環境Redis緩存穿透與雪崩防護性能優化實戰指南

生產環境Redis緩存穿透與雪崩防護性能優化實戰指南 在當下高并發場景下&#xff0c;Redis 作為主流緩存組件&#xff0c;能夠極大地提升讀寫性能&#xff0c;但同時也容易引發緩存穿透、緩存擊穿及緩存雪崩等問題&#xff0c;導致后端依賴數據庫的請求激增&#xff0c;系統穩定…

【洛谷刷題】用C語言和C++做一些入門題,練習洛谷IDE模式:分支機構(一)

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向 ??人…

嵌入式硬件篇---常見的單片機型號

以下是目前常用的單片機型號及其應用場景、優劣勢的詳細解析&#xff0c;結合最新行業動態和技術特性&#xff0c;幫助你精準匹配需求&#xff1a;一、經典 8 位單片機&#xff1a;低成本入門首選1. 51 系列&#xff08;代表型號&#xff1a;AT89C51、STC89C52&#xff09;應用…

windows下ArcGIS 10.8.2下載安裝教程

ArcGIS是由美國環境系統研究所&#xff08;Esri&#xff09;開發的一款功能強大且應用廣泛的綜合性地理信息系統&#xff08;GIS&#xff09;軟件平臺&#xff0c;在空間數據的采集、管理、分析、可視化和共享等方面表現出色&#xff0c;是GIS領域的標桿產品。它擁有豐富的功能…

防御保護15

混合密碼體系 --- 數字信封 邏輯 --- 先用快速的對稱密鑰來對消息進行加密&#xff0c;保證數據的機密性。然后只需要保證對稱密鑰的機密性即可&#xff0c;使用公鑰密鑰體系來對對稱秘鑰消息進行加密。身份認證和數據認證技術 Hash散列 指紋 ---> 單向散列函數 Hash --->…

Linux上管理Java的JDK版本

1.alternatives簡介alternatives是 Linux 系統&#xff08;尤其是 ??RHEL/CentOS/Fedora?? 等基于 RPM 的發行版&#xff09;中用于管理??同一軟件多個版本??的系統工具。它通過維護符號鏈接&#xff08;軟鏈接&#xff09;的層級結構&#xff0c;幫助用戶在不沖突的情…

webrtc編譯arm/arm64

webrtc版本 m125版本 編譯arm sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf //下載失敗,需要多次嘗試 python3 build/linux/sysroot_scripts/install-sysroot.py --arch=arm //python3 bui

【讀論文】醫療AI大模型:百川開源Baichuan-M2

1. 引言 最新百川開源了一個可以和openai新模型掰手腕的醫療垂直大模型:Baichuan-M2在HealthBench基準上取值60.1的高分,超過了gpt-oss-120b。這次一起回顧下百川給的技術報告。 2. Baichuan-M2概覽:“模型+系統” Baichuan-M2的成功源于一套精心設計的、端到端的訓練與優…

OBOO鷗柏丨75寸/86平板企業辦公會議觸控一體機核心國產化品牌招投標參數

OBOO鷗柏整機參數要求&#xff1a;55寸/65寸/75寸/85-86寸/98寸/100寸/110寸/115寸智能會議平板教學觸控一體機/智慧黑板觸摸屏參數要求。系統可靈活選擇如&#xff1a;支持安卓&#xff08;Android&#xff09;&#xff0c;Windows可選擇。并在KylinOS銀河麒麟操作系統、統信U…

DCT域信息隱藏中超參數影響的深度解析:從理論到實踐的完整指南

摘要 隨著數字媒體技術的飛速發展,信息隱藏技術在版權保護、內容認證和隱私保護等領域發揮著越來越重要的作用。離散余弦變換(DCT)域作為信息隱藏的經典載體,因其與JPEG壓縮標準的天然兼容性而備受關注。然而,DCT域信息隱藏的效果很大程度上取決于各種超參數的精心調節,…

YOLOv8環境配置命令

【YOLOv8】一小時掌握&#xff0c;從0開始搭建部署YOLOv8系列教程&#xff0c;安裝推理自定義數據集訓練與搭建_嗶哩嗶哩_bilibili【YOLOv8】一小時掌握&#xff0c;從0開始搭建部署YOLOv8系列教程&#xff0c;安裝推理自定義數據集訓練與搭建共計10條視頻&#xff0c;包括&…