日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++Primer学习笔记:第8章 IO库

發(fā)布時間:2023/11/30 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++Primer学习笔记:第8章 IO库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • C++語言不直接處理輸入輸出,而是通過一族定義在標準庫中的類型來處理IO

    • iostream定義了用于讀寫流的基本類型
    • fstream定義了讀寫命名文件的類型
    • sstream定義了讀寫內(nèi)存string對象的類型
  • 標準庫使得我們能夠忽略這些不同類型的流之間的差異,是通過繼承機制實現(xiàn)的

  • 不能拷貝或者對IO對象賦值,因此也不能將形式參數(shù)或者返回類型設置為流類型,進行IO操作的函數(shù)通常是已引用方式傳遞和返回流,讀寫一個IO對象會改變其狀態(tài),因此傳遞和返回的引用不能是const的

    strm::iostate 提供表達條件狀態(tài)的完整功能 strm::badbit 用來指出流已經(jīng)崩潰 strm::failbit 用來指出一個IO操作失敗了 strm::eofbit 用來指出流到達了文件結(jié)束 strm::goodbit 用來指出流未處于錯誤狀態(tài),此值保證為零 s.eof() 若流s的eofbit置位,返回true s.fail() s.bad() s.good() 若流s處于有效狀態(tài),返回true s.clear() 所有條件狀態(tài)復位,將流的狀態(tài)設置為有效,返回void s.clear(flags) 根據(jù)給定的flags標志位將流s中對應條件狀態(tài)位復位 s.setstate(flags)同上 s.rdstate() 返回流s的當前條件狀態(tài) auto old_state = cin.rdstate(); //記住cin的當前狀態(tài) cin.clear() //使cin有效 process_input(cin); //使用cin cin.setstate(old_state); //將cin置為原有狀態(tài) cin.clear(cin.rdstate & ~cin.failbit & ~cin.badbit); //復位failbit和badbit,保持eofbit不變
  • 通過緩沖機制,操作系統(tǒng)可以將程序的多個輸出操作組合成單一的系統(tǒng)級寫操作。(原因在于設備的寫操作可能很耗時)

  • 導致緩沖刷新的原因:

    • 程序正常結(jié)束,作為main函數(shù)的return操作的一部分,緩沖刷新被執(zhí)行
    • 緩沖區(qū)滿
    • 使用操縱符endl顯式刷新緩沖區(qū)
    • 在每個輸出操作后,可以用操作符unitbuf設置流的內(nèi)部狀態(tài),來清空緩沖區(qū)(默認情況下cerr是設置unitbuf的,因此寫到cerr的內(nèi)容都是立即刷新的)
    • 一個輸出流可能被關聯(lián)到另一個流。在這種情況下,當讀寫被關聯(lián)的流時,關聯(lián)到的流的緩沖區(qū)會被刷新
  • 除了endl外,還可以使用flush和ends刷新緩沖區(qū),但是他們有不同的效果:

    cout << "hi" << endl; //輸出"hi\n" cout << "hi" << flush; //輸出"hi" cout << "hi" << ends; //輸出"hi "
  • 如果想在每次輸出操作后都刷新緩沖區(qū),我們可以使用unitbuf操縱符,它告訴流在接下來每次寫操作后都進行一次flush操作

    cout << unitbuf; //所有輸出操作都會立即刷新緩沖區(qū) cout << nounitbuf; //回到正常的緩沖方式
  • 調(diào)試/程序崩潰時要記得及時刷新緩沖區(qū)

  • 當一個輸入流被關聯(lián)到一個輸出流時,任何試圖從輸入流讀取數(shù)據(jù)的操作都會先刷新關聯(lián)的輸出流(例如cin和cout)。交互式系統(tǒng)通常應該關聯(lián)輸入流和輸出流。每個輸入流最多關聯(lián)到一個流,但多個流可以同時關聯(lián)到同一個ostream

    cin.tie(); //返回cin關聯(lián)的流,如果之前沒有關聯(lián)則返回空指針 cin.tie(&cout); //返回值同上,但是將cin與cout關聯(lián) ostream *old_tie = cin.tie(nullptr); //取消關聯(lián),同時保存關聯(lián)的流的指針 cin.tie(old_tie); //恢復關聯(lián)
  • 文件輸入輸出的流定義在頭文件fstream中

    fstream fstrm; fstream fstrm(s); 打開名為s的文件,s可以是string類型或者是一個指向C風格字符串的指針,默認的文件模式mode依賴 fstream的類型 fstream fstrm(s, mode); fstrm.open(s); 打開名為s的文件,并將文件與fstrm綁定,返回void fstrm.close(); 關閉與fstrm綁定的文件,返回void fstrm.is_open(s); 返回一個bool,指出與fstrm關聯(lián)的文件是否打開成功且尚未關閉
  • 我們可以用fstream代替iostream&,即在需要接受一個iostream類型引用或者指針參數(shù)的函數(shù)可以用一個對應的fstream或sstream來調(diào)用

  • 在使用流之前檢查是一個好的習慣

  • 當一個fstream對象被銷毀時,close會自動被調(diào)用

  • 每個流都有一個關聯(lián)的文件模式,用來指出如何使用文件

    in 以讀方式打開,只可以對ifstream或fstream out 以寫方式打開,只可以對ofstream或fstream,默認情況下,即使我們沒有指定trunc,以out模式打開的文件也會被截 斷,為了保留以out模式打開的文件的內(nèi)容,我們必須同時指定app,或者指定infstream默認關聯(lián)in和out app 每次操作均定位到文件末尾,只要trunc沒有被設定就可以設定,包含out ate 打開文件后立即定位到文件末尾 trunc 截斷文件,只有當out也被設定時才能設定 binary 以二進制方式進行IO //下面三種方式打開文件是等價的,都會截斷文件 ofstream out("file"); ofstream out("file", ofstream::out); ofstream out("file", ofstream::out | ofstream::trunc); //為了保留文件的內(nèi)容,我們必須顯式指定app模式 ofstream out("file", ofstream::app); ofstream out("file", ofstream::out | ofstream::app);
  • sstream頭文件定義了三個類型來支持內(nèi)存IO,這些類型可以向string寫入數(shù)據(jù),從string讀取數(shù)據(jù)

  • istringstream從string讀取數(shù)據(jù),ostringstream向string寫入數(shù)據(jù),stringstream既可以讀也可以寫

    sstream strm; sstream strm(s); strm保存string類型的s的拷貝 strm.str() 返回strm保存的string的拷貝 strm.str(s) 將string s拷貝到strm中,返回void

總結(jié)

以上是生活随笔為你收集整理的C++Primer学习笔记:第8章 IO库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。