14-1、IO流

14-1、IO流

  • lO流打開和關閉
    • lO流打開模式
    • lO流對象的狀態
  • 非格式化IO
  • 二進制IO
    • 讀取二進制數據
    • 獲取讀長度
    • 寫入二進制數據
  • 讀寫指針 和 隨機訪問
    • 設置讀/寫指針位置
    • 獲取讀/寫指針位置
  • 字符串流

lO流打開和關閉

通過構造函數打開I/O流
其中filename表示文件路徑,mode表示打開模式

  • 打開輸入流
    ifstream (const char* filename ,openmode mode)
  • 打開輸出流
    ofstream(const char* filename , openmode mode);
  • 打開輸入輸出流
    fstream (const char* filename , openmode mode);

lO流打開模式

  • ios::out
    打開文件用于寫入,不存在則創建,存在則清空
    適用于ofstream(缺省)/fstream
  • ios::app
    打開文件用于追加,不存在則創建,存在不清空
    適用于ofstream/fstream
  • ios::trunc
    打開時清空原內容
    適用于ofstream/fstream
  • ios:in
    打開文件用于讀取,不存在則失敗,存在不清空
    適用于ifstream(缺省)/fstream
  • ios::ate
    打開時定位文件尾
    適用于ifstream/fstream
  • ios.:binary
    以二進制模式讀寫
    適用于ifstream/ofstream/fstream
#include <iostream>
#include <fstream>
using namespace std;
// C++標準庫已經設計好的類ofstream(文件輸出流)類int main( void ){ofstream ofs1("./file",ios::out);if(!ofs1){ // !(ofs1.operator bool())cout << "ofs1流對象狀態錯誤 -- 打開文件失敗" << endl;}ofs1 << 1234 << ' ' << 56.78 << ' ' << "Hello" << '\n';if(!ofs1){cout << "ofs1流對象狀態錯誤 -- 寫文件失敗" << endl;}ofs1.close();ofstream ofs2("./file",ios::app);if(!ofs2){ // !(ofs2.operator bool())cout << "ofs2流對象狀態錯誤 -- 打開文件失敗" << endl;}ofs2 << "World" << endl;;if(!ofs2){cout << "ofs2流對象狀態錯誤 -- 寫文件失敗" << endl;}ofs2.close();return 0;
} 
#include <iostream>
#include <fstream>
using namespace std;
// C++標準庫已經設計好的類ifstream(文件輸入流)類int main( void ){ifstream ifs1("./file",ios::in);if(!ifs1){ // !(ifs1.operator bool())cout << "ifs1流對象狀態錯誤 -- 打開文件失敗" << endl;}int i; double d; string s1,s2;ifs1 >> i >> d >> s1 >> s2;if(!ifs1){cout << "ifs1流對象狀態錯誤 -- 讀文件失敗" << endl;}cout << i << ' ' << d << ' ' << s1 << ' ' << s2 << endl;ifs1.close();ifstream ifs2("./file",ios::ate);if(!ifs2){ // !(ifs2.operator bool())cout << "ifs2流對象狀態錯誤 -- 打開文件失敗" << endl;}ifs2.seekg(0,ios::beg);int ii; double dd; string ss1,ss2;ifs2 >> ii >> dd >> ss1 >> ss2;if(!ifs2){cout << "ifs2流對象狀態錯誤 -- 讀文件失敗" << endl;}cout << ii << ' ' << dd << ' ' << ss1 << ' ' << ss2 << endl;ifs2.close();return 0;
} 

lO流對象的狀態

I/O流類對象內部保存當前狀態,其值為以下常量的位或

  • ios:goodbit: 0,一切正常
  • ios::badbit: 1,發生致命錯誤
  • ios::eofbit: 2,遇到文件尾
  • ios::failbit: 4,打開文件失敗或實際讀寫字節數未達預期
    在這里插入圖片描述

l/O流類對象支持到bool類型的隱式轉換

  • 發生1,2,4等情況,返回false,否則返回true
  • 將I/O流對象直接應用到布爾上下文中,即可實現轉換

處于1或4狀態的流,在復位前無法工作

#include <iostream>
#include <fstream>
using namespace std;
// C++標準庫已經設計好的類ifstream(文件輸入流)類int main( void ){ifstream ifs2("./file",ios::ate);if(!ifs2){ // !(ifs2.operator bool())cout << "ifs2流對象狀態錯誤 -- 打開文件失敗" << endl;}int ii; double dd; string ss1,ss2;cout << "--------------------第一次讀數據-----------------------" << endl;ifs2 >> ii >> dd >> ss1 >> ss2;// ifs2.operator>>(ii).operator>>(dd)>>operator>>(ss1)>>operator>>(ss2)if(!ifs2){cout << "ifs2流對象狀態錯誤 -- 讀文件失敗" << endl;cout << "ifs2是0狀態嗎?" << ifs2.good() << ", ifs2是1狀態嗎?" << ifs2.bad()<< ", ifs2是2狀態嗎?" << ifs2.eof() << ", ifs2是4狀態嗎?" << ifs2.fail() << endl;cout << "ifs2的具體狀態:" << ifs2.rdstate() << endl;}cout << ii << ' ' << dd << ' ' << ss1 << ' ' << ss2 << endl;ifs2.clear();ifs2.seekg(0,ios::beg);cout << "--------------------第二次讀數據-----------------------" << endl;ifs2 >> ii >> dd >> ss1 >> ss2;// ifs2.operator>>(ii).operator>>(dd)>>operator>>(ss1)>>operator>>(ss2)if(!ifs2){cout << "ifs2流對象狀態錯誤 -- 讀文件失敗" << endl;cout << "ifs2是0狀態嗎?" << ifs2.good() << ", ifs2是1狀態嗎?" << ifs2.bad()<< ", ifs2是2狀態嗎?" << ifs2.eof() << ", ifs2是4狀態嗎?" << ifs2.fail() << endl;cout << "ifs2的具體狀態:" << ifs2.rdstate() << endl;}cout << ii << ' ' << dd << ' ' << ss1 << ' ' << ss2 << endl;ifs2.close();return 0;
} 

非格式化IO

  • 寫入字符
    ostream& ostream::put (char ch);一次向輸出流寫入一個字符,返回流本身
  • 刷輸出流
    ostream& ostream::flush (void);將輸出流緩沖區中的數據刷到設備上,返回流本身
  • 讀取字符
    int istream::get (void);成功返回讀到的字符,失敗或遇到文件尾返回EOF
    istream& istream::get (char& ch);返回輸入流本身,其在布爾上下文中的值,成功為true,失敗或遇到文件尾為false
  • 讀取行
    istream& istream::getline (char* buffer,streamsize num, char delim = ‘\ n’);
    • 讀取字符 (至定界符)到buffer中。
    • 一旦讀取了num個字符還未讀取定界符,第num個字符設置為 ‘\0’,返回 (輸入流對象狀態為4)。
    • 如果因為遇到定界符 (缺省為 ‘\n’ ) 返回 (輸入流對象狀態為0)定界符被讀取并丟棄,追加結尾空字符 ‘\0’,讀指針停在該定界符的下一個位置
    • 遇到文件尾,返回 (輸入流對象狀態為6)
#include <iostream>
#include <fstream>
using namespace std;// C++標準庫已經設計好的類ofstream(文件輸出流)、ifstream(文件輸入流)類int main( void ){ofstream ofs("./noformat",ios::out);if(!ofs)cout << "ofs流對象狀態錯誤 -- 打開文件失敗" << endl;for( char c = ' '; c <= '~';c++)ofs.put(c).flush();ofs.close();ifstream ifs("./noformat",ios::in);if(!ifs)cout << "ifs流對象狀態錯誤 -- 打開文件失敗" << endl;char c;// 單參getwhile(1){ifs.get(c);if(!ifs)break;elsecout << c;}cout << endl;ifs.clear();ifs.seekg(0,ios::beg);// 無參getwhile(1){c = ifs.get();if( c == EOF )break;elsecout << c;}cout << endl;ifs.close();return 0;
} 
#include <iostream>
#include <fstream>
using namespace std;// C++標準庫已經設計好的類ofstream(文件輸出流)、ifstream(文件輸入流)類int main( void ){ifstream ifs("./getline",ios::in);if(!ifs)cout << "ifs流對象狀態錯誤 -- 打開文件失敗" << endl;char buf[256];while(1){ifs.getline(buf,256,'\n');if(!ifs)break;else{cout << buf << endl;cout << "ifs流對象狀態值:" << ifs.rdstate() << endl;}}
/*ifs.getline(buf,256,'\n'); // aa\ncout << buf << endl;cout << "ifs流對象狀態值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // bbbb\ncout << buf << endl;cout << "ifs流對象狀態值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // cccccc\ncout << buf << endl;cout << "ifs流對象狀態值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // dddddddd\ncout << buf << endl;cout << "ifs流對象狀態值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // 0123456789\ncout << buf << endl;cout << "ifs流對象狀態值:" << ifs.rdstate() << endl;ifs.getline(buf,256,'\n'); // cout << buf << endl;cout << "ifs流對象狀態值:" << ifs.rdstate() << endl;
*/    ifs.close();return 0;
} 

二進制IO

讀取二進制數據

istream& istream::read (char* buffer,streamsize num)
  • 從輸入流中讀取num個字節到緩沖區buffer中
  • 返回流對象本身,其在布爾上下文中的值,成功(讀滿)為true,失敗(沒讀滿)為false
  • 如果沒讀滿num個字節,函數就返回了,比如遇到文件尾,最后一次讀到緩沖區,buffer中的字節數可以通過istream::gcount()函數獲得
#include <iostream>
#include <fstream>
using namespace std;// C++標準庫已經設計好的類ofstream(文件輸出流)、ifstream(文件輸入流)類int main( void ){ofstream ofs("./binary",ios::out);if(!ofs)cout << "ofs流對象狀態錯誤 -- 打開文件失敗" << endl;ifstream ifs("./getline",ios::in);if(!ifs)cout << "ifs流對象狀態錯誤 -- 打開文件失敗" << endl;char buf[3];while(1){ifs.read(buf,3);if(ifs){ofs.write(buf,3);
//          cout << buf; // 讀滿3個字符}else{// 沒有讀滿3個字符int len = ifs.gcount();ofs.write(buf,len);
//          buf[len]='\0';
//          cout << buf;break;}}ifs.close();ofs.close();return 0;
} 

獲取讀長度

streamsize istream::gcount (void)

返回最后一次從輸入流中讀取的字節數

寫入二進制數據

ostream& ostream::write (const char* buffer,streamsize num);
  • 將緩沖區buffer中的num個字節寫入到輸出流中
  • 返回流本身,其在布爾上下文中的值,成功(寫滿)為true,失敗(沒寫滿)為false
#include <iostream>
#include <fstream>
using namespace std;// C++標準庫已經設計好的類ofstream(文件輸出流)、ifstream(文件輸入流)類int main( void ){ofstream ofs("./binary",ios::out);if(!ofs)cout << "ofs流對象狀態錯誤 -- 打開文件失敗" << endl;ifstream ifs("./getline",ios::ate);if(!ifs)cout << "ifs流對象狀態錯誤 -- 打開文件失敗" << endl;int size = ifs.tellg();char buf[size];ifs.seekg(0,ios::beg);ifs.read(buf,size);ofs.write(buf,size);ifs.close();ofs.close();return 0;
} 

讀寫指針 和 隨機訪問

設置讀/寫指針位置

istream& istream::seekg (off_type offset,ios::seekdir origin);
ostream& ostream::seekg (off_type offset,ios::seekdir origin);

origin表示偏移量offset的起點:

  • ios::beg從文件的第一個字節
  • ios::cur從文件的當前位置
  • ios::end從文件最后一個字節的下一個位置
    offset為負/正表示向文件頭/尾的方向偏移
    讀/寫指針被移到文件頭之前或文件尾之后,則失敗

獲取讀/寫指針位置

返回讀/寫指針當前位置相對于文件頭的字節偏移量

pos type istream::tellg (void);
pos type ostream::tellp (void):

字符串流

輸出字符串流

#include <sstream>
ostringstream oss ;
oss << 1234 << ' ' << 56.78 <<' '<< "ABCD";
string os = oss.str();

輸入字符串流

#include <sstream>
string is ("1234 56.78 ABCD") ;
istringstream iss (is);
int i;
double d;
string s;
iss >> i >> d >> s;

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

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

相關文章

用Guava做本地緩存示例

緩存的作用 提升系統性能&#xff0c;暫時在內存中保存業務系統的數據處理結果&#xff0c;并且等待下次訪問使用 本地緩存和分布式緩存 緩存分為本地緩存與分布式緩存。本地緩存為了保證線程安全問題&#xff0c;一般使用ConcurrentMap的方式保存在內存之中&#xff0c;而常…

【KCC@南京】KCC南京“數字經濟-開源行”活動回顧錄

11月26日&#xff0c;由KCC南京、中科南京軟件研究所、傲空間、PowerData聯合主辦的 KCC南京“數字經濟-開源行” 的活動已圓滿結束。此次活動&#xff0c;3 場主題研討&#xff0c;11 場分享&#xff0c;現場參會人數 60&#xff0c;線上直播觀看 3000&#xff0c;各地小伙伴從…

Android畫布Canvas繪圖scale,Kotlin

Android畫布Canvas繪圖scale&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.…

數據倉庫工具Hive

1. 請解釋Hive是什么&#xff0c;它的主要用途是什么&#xff1f; Hive是一個基于Hadoop的數據倉庫工具&#xff0c;主要用于處理和分析大規模結構化數據。它可以將結構化的數據文件映射為一張數據庫表&#xff0c;并提供類似SQL的查詢功能&#xff0c;將SQL語句轉換為MapRedu…

Windows 和 MacOS 上安裝配置ADB(安卓調試橋)

一、Android 調試橋 (ADB) Android 調試橋&#xff08;ADB&#xff09; 是一款多功能命令行工具&#xff0c;它讓你能夠更便捷地訪問和管理 Android 設備。使用 ADB 命令&#xff0c;你可以輕松執行以下操作 在設備上安裝、復制和刪除文件&#xff1b;安裝應用程序&#xff1…

YOLOV3 SPP 目標檢測項目(針對xml或者yolo標注的自定義數據集)

1. 目標檢測的兩種標注形式 項目下載地址:YOLOV3 SPP網絡對自定義數據集的目標檢測(標注方式包括xml或者yolo格式) 目標檢測邊界框的表現形式有兩種: YOLO(txt) : 第一個為類別,后面四個為邊界框,x,y中心點坐標以及h,w的相對值 xml文件:類似于網頁的標注文件,里面會…

力扣第 375 場周賽(Java)

文章目錄 T1 統計已測試設備代碼解釋 T2 雙模冪運算代碼解釋 T3 統計最大元素出現至少 K 次的子數組代碼解釋 T4 統計好分割方案的數目代碼解釋 鏈接&#xff1a;第 375 場周賽 - 力扣&#xff08;LeetCode&#xff09; T1 統計已測試設備 給你一個長度為 n 、下標從 0 開始的…

JavaEE 08 線程池簡介

前言 前面我們談完了定時器,單例模式,阻塞隊列等的操作并且做了模擬實現,今天我們再來說一說線程池的操作以及一些鎖策略. 注:本章幾乎均為理論篇,實踐較少. 下面就讓我們開始吧. 線程池 我們知道因為進程的頻繁創建和銷毀,帶來的開銷過大,我們無法接受,所以我們引入了更輕量級…

Linux常見壓縮指令小結

為什么需要壓縮技術 我們都知道文件是以byte作為單位的&#xff0c;如果我們的文件僅僅在低位占一個1 0000 0001這種情況我們完全可以壓縮一下&#xff0c;將高位的0全部抹掉即可。 如上所說是一種壓縮技術&#xff0c;還有一種就是將1111(此處省略96個)一共100個1&#xff0…

mysql執行帶函數命令的sql腳本報錯

一、前言 開發給了一個帶函數的sql文件讓我執行&#xff0c;但是執行導入時報以下錯誤 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled 二、解決 在數據庫命令行中執行以下命令&#xff08;臨時生效&…

HarmonyOS4.0從零開始的開發教程11給您的應用添加彈窗

HarmonyOS&#xff08;十&#xff09;給您的應用添加彈窗 概述 在我們日常使用應用的時候&#xff0c;可能會進行一些敏感的操作&#xff0c;比如刪除聯系人&#xff0c;這時候我們給應用添加彈窗來提示用戶是否需要執行該操作&#xff0c;如下圖所示&#xff1a; 彈窗是一種…

AI:99-基于深度學習的飛機故障檢測與維修

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的核心代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新…

【pycharm】Pycharm中進行Git版本控制

本篇文章主要記錄一下自己在pycharm上使用git的操作&#xff0c;一個新項目如何使用git進行版本控制。 文章使用的pycharm版本PyCharm Community Edition 2017.2.4&#xff0c;遠程倉庫為https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Gitee創建…

記錄一次云原生線上服務數據遷移全過程

文章目錄 背景遷移方案調研遷移過程服務監控腳本定時任務暫停本地副本服務啟動&#xff0c;在線服務下線MySQL 數據遷移Mongo 數據遷移切換新數據庫 ip 本地服務啟動數據庫連接驗證服務打包部署服務重啟前端恢復正常監控腳本定時任務啟動舊服務器器容器關閉 遷移總結 背景 校園…

正確使用React組件緩存

簡介 正常來講的話當我們點擊組件的時候&#xff0c;該組件以及該組件的子組件都會重新渲染&#xff0c;但是如何避免子組件重新渲染呢&#xff0c;我們經常用memo來解決 React.memo配合useCallback緩存組件 父組件沒有傳props const Index ()> {console.log(子組件刷新…

Java14道高頻面試題

面試題 1、JWT ①、JWT(全稱:Json Web Token)是一個開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為 JSON 對象在各方之間安全地傳輸信息。 ②、JWT 的原理是&#xff0c;服務器認證以后&#xff0c;生成一個 JSON 對象&#xff0c;發回給用戶 ③、JWT是由頭…

機器學習基本概念介紹 2023

筆記來源于&#xff1a; https://www.youtube.com/watch?vphQK8xZpgoU&t172s https://www.youtube.com/watch?vXLyPFnephpY&t645s Machine/Deep Learning 機器學習概況來說&#xff0c;讓機器具備自動找函式的能力 &#xff08;Machine Learning 約等于 Looking …

智能優化算法應用:基于飛蛾撲火算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于飛蛾撲火算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于飛蛾撲火算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.飛蛾撲火算法4.實驗參數設定5.算法結果6.…

訂單系統的設計與海量數據處理實戰

概述 訂單系統可以說是整個電商系統中最重要的一個子系統&#xff0c;因此訂單數據可以算作電商企業最重要的數據資產。訂單系統從代碼上來說可分為兩部分&#xff1a;訂單程序和歷史訂單處理程序。數據存儲進行分庫分表。 訂單系統業務分析 對于一個合格的訂單系統&#xf…

如何使用bash寫腳本

本章主要介紹如何使用bash寫腳本。 了解通配符了解變量了解返回值和數值運算數值的對比判斷語句循環語句 grep的用法是“grep 關鍵字 file”&#xff0c;意思是從file中過濾出含有關鍵字的行。 例如&#xff0c;grep root /var/log/messages&#xff0c;意思是從/var/log/me…