C++IO流

      網友投稿 825 2025-04-07

      @TOC


      零、前言

      本章將學習和掌握C++的IO流的知識以及與C語言IO流做一個對比

      一、C語言的輸入輸出

      概念:

      C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()

      scanf():

      從標準輸入設備(鍵盤)讀取數據,并將值存放在變量中

      printf():

      將指定的文字/字符串輸出到標準輸出設備(屏幕)(注意寬度輸出和精度輸出控制)

      C語言借助了相應的緩沖區來進行輸入與輸出

      示圖:

      對輸入輸出緩沖區的理解:

      可以屏蔽掉低級IO的實現,低級I/O的實現依賴操作系統本身內核的實現,所以如果能夠屏蔽這部分的差異,可以很容易寫出可移植的程序

      可以使用這部分的內容實現“行”讀取的行為,對于計算機而言是沒有“行”這個概念,有了這部分,就可以定義“行”的概念,然后解析緩沖區的內容,返回一個“行”

      C語言IO流的博文詳解:?? C語言進階 ?? 文件操作超詳解【 建議關注+ 】_彥祖你終于來啦!~-CSDN博客

      二、什么是流

      概念:

      “流”即是流動的意思,是物質從一處向另一處流動的過程,是對一種有序連續且具有方向性的數據(其單位可以是bit,byte,packet )的抽象描述

      C++流是指信息從外部輸入設備(如鍵盤)向計算機內部(如內存)輸入和從內存向外部輸出設備(顯示器)輸出的過程,這種輸入輸出的過程被形象的比喻為“流”

      特性:

      有序連續**、**具有方向性

      注:為了實現這種流動,C++定義了I/O標準類庫,這些每個類都稱為流/流類,用以完成某方面的功能

      三、C++IO流

      C++系統實現了一個龐大的類庫,其中ios為基類,其他類都是直接或間接派生自ios類

      示圖:

      四、C++標準IO流

      標準IO流對象:

      C++標準庫提供了4個全局流對象cin、cout、cerr、clog

      注:在使用時候必須要包含文件并引入std標準命名空間

      介紹:

      使用cout進行標準輸出,即數據從內存流向控制臺(顯示器)

      使用cin進行標準輸入即數據通過鍵盤輸入到程序中

      使用cerr用來進行標準錯誤的輸出

      使用clog進行日志的輸

      建議:

      C++盡量去用cin和cout,能用它就用他(便捷,不易出錯)

      用cout和cin不方便的地方,再去用scanf和printf(如對于輸出格式有特別需求的)

      注意:

      cout、cerr、clog是ostream類的三個不同的對象,但是基本沒有區別,只是應用場景不同

      cin為緩沖流

      解釋:

      鍵盤輸入的數據保存在緩沖區中,當要提取時,是從緩沖區中拿如果一次輸入過多,會留在那兒慢慢用,如果輸入錯了,必須在回車之前修改,如果回車鍵按下就無法挽回了;只有把輸入緩沖區中的數據取完后,才要求輸入新的數據

      輸入的數據類型必須與要提取的數據類型一致,否則出錯,出錯只是在流的狀態字state中對應位置位

      空格和回車都可以作為數據之間的分格符,所以多個數據可以在一行輸入,也可以分行輸入

      注意:

      如果是字符型和字符串,則空格(ASCII碼為32)無法用cin輸入,字符串中也不能有空格,回車符也無法讀入

      如果需要只以\n作為結束符,可以使用getline

      . cin和cout可以直接輸入和輸出內置類型數據

      原因:標準庫已經將所有內置類型的輸入和輸出全部重載了

      注:對于自定義類型,如果要支持cin和cout的標準輸入輸出,需要對<<和>>進行重載

      循環輸入

      示例:

      // 單個元素循環輸入 while(cin>>a) { // ... } // 多個元素循環輸入 while(c>>a>>b>>c) { // ... } // 整行接收 while(cin>>str) { // ... }

      注:我們知道cin的返回值是輸入流,這里可以作為條件判斷的原因是,C++重載了operator bool(),要進行布爾判斷時,會自動調用該函數進行返回值強制類型轉化,再判斷是否繼續執行

      除此之外,自定義類型也可以直接做條件邏輯判斷

      示例:

      // evaluating a stream #include // std::cerr #include // std::ifstream int main () { std::ifstream is; is.open ("test.txt"); if (is) { // read file } else { std::cerr << "Error opening 'test.txt'\n"; } return 0; }

      注:operator bool () 提供一個本類型到bool的隱式轉換,不允許使用參數(這樣的重載是一個特例,與operator new類似)

      五、C++文件IO流

      C++根據文件內容的數據格式分為二進制文件和文本文件

      采用文件流對象操作文件的一般步驟:

      定義一個文件流對象

      ifstream ifile(只輸入用)

      ofstream ofile(只輸出用)

      fstream iofile(既輸入又輸出用)

      使用文件流對象的成員函數打開一個磁盤文件,使得文件流對象和磁盤文件之間建立聯系

      使用提取和插入運算符對文件進行讀寫操作,或使用成員函數進行讀寫

      關閉文件

      示例:

      #include #include using namespace std; // 使用文件IO流用文本及二進制方式演示讀寫配置文件 struct ServerInfo { char _ip[32]; // ip int _port; // 端口 }; struct ConfigManager { public: ConfigManager(const char* configfile = "cfserver.config") :_configfile(configfile) {} void WriteBin(const ServerInfo& info) { // 這里注意使用二進制方式打開寫 ofstream ofs(_configfile, ifstream::out | ifstream::binary); ofs.write((const char*)&info, sizeof(ServerInfo)); ofs.close(); } void ReadBin(ServerInfo& info) { // 這里注意使用二進制方式打開讀 ifstream ifs(_configfile, ifstream::in | ifstream::binary); ifs.read((char*)&info, sizeof(ServerInfo)); ifs.close(); } void WriteText(const ServerInfo& info) { // 這里會發現IO流寫整形比C語言那套就簡單多了, // C 語言得先把整形itoa再寫 ofstream ofs(_configfile); ofs << info._ip << endl; ofs << info._port << endl; ofs.close(); } void ReadText(ServerInfo& info) { // 這里會發現IO流讀整形比C語言那套就簡單多了, // C 語言得先讀字符串,再atoi ifstream ifs(_configfile); ifs >> info._ip; ifs >> info._port; ifs.close(); } private: string _configfile; // 配置文件 }; int main() { ConfigManager cfgMgr; ServerInfo wtinfo; ServerInfo rdinfo; strcpy(wtinfo._ip, "127.0.0.1"); wtinfo._port = 80; // 二進制讀寫 cfgMgr.WriteBin(wtinfo); cfgMgr.ReadBin(rdinfo); cout << rdinfo._ip << endl; cout << rdinfo._port << endl; // 文本讀寫 cfgMgr.WriteText(wtinfo); cfgMgr.ReadText(rdinfo); cout << rdinfo._ip << endl; cout << rdinfo._port << endl; return 0; }

      結果:

      注:相比于C語言方便很多,不用控制格式

      六、stringstream的介紹和使用

      引入:

      在C語言中將一個整形變量的數據轉化為字符串格式的方式有:

      使用itoa()函數

      使用sprintf()函數

      注意:

      兩個函數在轉化時,都得需要先給出保存結果的空間,那空間要給多大呢,就不太好界定,而且轉化格式不匹配時,可能還會得到錯誤的結果甚至程序崩潰

      示例:

      void test() { int n = 123456789; char s1[32]; _itoa(n, s1, 10); char s2[32]; sprintf(s2, "%d", n); char s3[32]; sprintf(s3, "%f", n); }

      在C++中,對此問題引入了stringstream類

      注意:

      使用時需包含頭文件sstream,在sstream頭文件下,標準庫三個類:istringstream、ostringstream 和 stringstream,分別用來進行流的輸入、輸出和輸入輸出操作

      stringstream作用:

      將數值類型數據格式化為字符串

      示例:

      #include void test_stringstream1() { int a = 12345678; string sa; // 將一個整形變量轉化為字符串,存儲到string類對象中 stringstream s; s << a; s >> sa; cout << sa << endl; // clear() // 注意多次轉換時,必須使用clear將上次轉換狀態清空掉 // stringstreams在轉換結尾時(即最后一個轉換后),會將其內部狀態設置為badbit // 因此下一次轉換是必須調用clear()將狀態重置為goodbit才可以轉換 // 但是clear()不會將stringstreams底層字符串清空掉 // s.str(""); // 將stringstream底層管理string對象設置成"", // 否則多次轉換時,會將結果全部累積在底層string對象中 s.str(""); s.clear(); // 清空s, 不清空會轉化失敗 double d = 12.34; s << d; s >> sa; string sValue; sValue = s.str(); // str()方法:返回stringsteam中管理的string類型 cout << sValue << endl; }

      C++IO流

      結果:

      字符串拼接

      示例:

      void test_stringstream2() { stringstream sstream; // 將多個字符串放入 sstream 中 sstream << "first" << " " << "string,"; sstream << " second string"; cout << "strResult is: " << sstream.str() << endl; // 清空 sstream sstream.str(""); sstream << "third string"; cout << "After clear, strResult is: " << sstream.str() << endl; }

      結果:

      注意:

      stringstream實際是在其底層維護了一個string類型的對象用來保存結果

      多次數據類型轉化時,一定要用clear()來清空,才能正確轉化,但clear()不會將stringstream底層的string對象清空

      可以使用s. str("")方法將底層string對象設置為""空字符串

      可以使用s.str()將讓stringstream返回其底層的string對象

      stringstream使用string類對象代替字符數組,可以避免緩沖區溢出的危險,而且其會對參數類型進行推演,不需要格式化控制,也不會出現格式化失敗的風險,因此使用更方便,更安全

      C++

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:在Excel中怎么能讓單行多行表頭不移動
      下一篇:Word文檔中如何插入斜線表頭(word怎么添加表頭斜線)
      相關文章
      亚洲视频在线精品| 亚洲精品日韩中文字幕久久久| 亚洲精品乱码久久久久久中文字幕 | 亚洲欧洲在线播放| 亚洲ⅴ国产v天堂a无码二区| 亚洲AV一宅男色影视| 亚洲中文字幕无码久久精品1| 日韩精品亚洲aⅴ在线影院| 亚洲日韩在线观看免费视频| 亚洲熟妇少妇任你躁在线观看无码| 亚洲av激情无码专区在线播放| 亚洲精品V欧洲精品V日韩精品| 亚洲人成色77777| 亚洲av永久无码精品漫画| 亚洲AV无码乱码在线观看富二代| 亚洲国产另类久久久精品 | 97se亚洲国产综合自在线| 国产成人精品亚洲2020| 亚洲中文字幕无码av永久| 亚洲码和欧洲码一码二码三码| 亚洲精品欧美综合四区| 国内成人精品亚洲日本语音 | 亚洲精品视频在线| 亚洲综合图片小说区热久久| 亚洲人成电影青青在线播放| 国产成人精品日本亚洲网址 | 亚洲av不卡一区二区三区| 亚洲欧洲日韩国产综合在线二区| 精品亚洲成a人片在线观看少妇| 亚洲视频一区在线观看| 亚洲另类视频在线观看| 亚洲色精品三区二区一区| 国产精品国产亚洲区艳妇糸列短篇| 亚洲 无码 在线 专区| 久久久久亚洲AV成人网人人网站| 久久亚洲国产午夜精品理论片| 亚洲AV天天做在线观看| 亚洲美女中文字幕| 国产午夜亚洲精品| 相泽南亚洲一区二区在线播放| 久久亚洲国产精品五月天婷|