天天看點

C++ 輸入輸出流之标準I/O

1. C++輸入輸入輸出包括:

  • 标準I/O:對系統指定的标準裝置的輸入和輸出。比如鍵盤輸入資料,輸出到顯示螢幕
  • 檔案I/O:以外存磁盤檔案為對象進行輸入和輸出。例如從磁盤檔案輸入資料,資料輸出到磁盤檔案。
  • 字元串I/O:對記憶體中指定的空間進行輸入和輸出。

2. I/O類庫中的常用流類

C++ 輸入輸出流之标準I/O

3. iostream類庫的即可分别由不同的頭檔案來實作:

  • iostream:包含了對輸入輸出流進行操作所需的基本資訊
  • fstream:用于使用者管理的檔案的I/O操作
  • strstream:用于字元串流I/O
  • stdiostream:用于混合使用C和C++的I/O機制時,例如想将C程式轉變為C++程式
  • iomanip:在使用格式化I/O時應包含此檔案

4. 标準輸出流

  • cout 流對象:cout是console output的縮寫,意為在控制台(終端顯示器)的輸出。可以傳送到顯示器輸出,也可以重定向到磁盤檔案
  • cerr 流對象:标準錯誤流,隻能在顯示器輸出,不經過緩沖區
  • clog 流對象:在終端顯示器顯示錯誤資訊。clog中的資訊存放在緩沖區,緩沖區滿後或者遇endl時向顯示器輸出。

5 格式輸出 (iomanip)

5.1 使用控制符控制輸入格式 (使用 cout << dec << )

控制符 作用
dec 設定整數的基數為10
hex 設定整數的基數為16
oct 設定 整數的基數為8
setbase(n) 設定整數的基數為n(n隻能是16,10,8之一)
setfill(c) 設定填充字元c,c可以是字元常量或字元變量
setprecision(n) 設定實數的精度為n位。在以一般十進制小數形式輸出時,n代表有效數字。在以fixed(固定小數位 數)形式和scientific(指數)形式輸出時,n為小數位數。預設為6.
setw(n) 設定字段寬度為n位。
setiosflags(ios::fixed) 設定浮點數以固定的小數位數顯示。
setiosflags(ios::scientific) 設定浮點數以科學計數法(即指數形式)顯示。
setiosflags(ios::left) 輸出資料左對齊。
setiosflags(ios::right) 輸出資料右對齊。
setiosflags(ios::shipws) 忽略前導的空格。
setiosflags(ios::uppercase) 在以科學計數法輸出E和十六進制輸出字母X時,以大寫表示。
setiosflags(ios::showpos) 輸出正數時,給出“+”号。
resetiosflags() 終止已設定的輸出格式狀态,在括号中應指定内容。
  • 備注1:dec,hex,oct隻能選一個,預設是dec。(設定隻對目前有效)
  • 使用控制符setiosflags()設定輸出格式後,如果想設定為同組的另一種狀态,需要先調用resetiosflags()終止原來的設定之後再重新設定。

 5.2 用于控制輸出格式的流成員函數 (使用cout.function)

流成員函數 與之作用相同的控制符 作用
precision(n) setprecision(n) 設定實 數的精度為n位。
width(n) setw(n) 設定字段寬度為n位。
fill(c) setfill(c) 設定填充字元c。
setf( ) setiosflags( ) 設定輸出格式狀态,括号中應給出格式狀态,内容與控制符setiosflags括号中内容相同。
unsetf( ) (與setf搭配使用) resetiosflags( ) 終止已設定的輸出格式狀态。

5.3. 設定格式狀态的格式标志

格式标志 作用
ios::left 輸出資料在本域寬範 圍内左對齊
ios::right 輸出資料在本域寬範圍内右對齊
ios::internal 數值的符号位在域寬内左對齊,數值右對齊,中間由填充字元填充
ios::dec 設定整數的基數為10
ios::oct 設定整數的基數為8
ios::hex 設定整數的基數為16
ios::showbase 強制輸出整數的基數(八進制以0打頭,十六進制以0x打頭)
ios::showpoint 強制輸出浮點數的小點和尾數0
ios::uppercase 在以科學計數法輸出E和十六進制輸出字母X時,以大寫表示
ios::showpos 輸出正數時,給出“+”号。
ios::scientific 設定浮點數以科學計數法(即指數形式)顯示
ios::fixed 設定浮點數以固定的小數位數顯示
ios::unitbuf 每次輸出後重新整理所有流
ios::stdio 每次輸出後清除 stdout,stderr
  • 備注1:需要設定輸出指定的寬度,必須每次設定width()或者setw()
  • 使用setf()設定了某種狀态,如果需要改變,需要先使用unsetf終止原來的設定,然後再重新設定。

6. 輸出流成員函數put:輸出單個字元。例如cout.put(65); // 輸出'A',功能同putchar(65)一樣。

7. 标準輸入流

  • cin流:
    • Ctrl+Z表示檔案結束符。
    • if (!cin) cout << "error"; 或者while (cin>>num) //判斷流對象是否處于正常狀态和提取操作是否成功。
    • "cin>>"從輸入流提取資料,遇到空格或者回車就終止。
  • 用于字元串輸入的流成員函數get:
    • char ch;
    • 不帶參數的get函數:ch = cin.get(); (cin.get() == EOF檔案結束符)
    • 帶一個參數的get函數:cin.get(ch);
    • 有3個參數的get函數:cin.get(字元串數組/字元串指針,字元個數n,終止字元)
      • 終止字元預設為'\n'
      • 讀取n-1個字元,最後一位為'\0'
      • 如果在讀取n-1個字元之前遇到終止符,則提前結束讀取。cin.get停在終止符的原位置。
  • 用成員函數getline函數讀取一行字元:cin.getline(字元串數組/字元串指針,字元個數n,終止标志字元)
    • 終止字元預設為'\n'。
    • (終止字元未被讀入,下一個getline從終止标志的下一個字元開始接着讀入)

8. istream類的其他函數

  • eof:
    • 調用形式cin.eof()。
    • 數值為非零表示真,反之為0标示假(^Z)。
  • peek:
    • 調用形式ch=cin.peek()。
    • 觀察下一個字元,指針停留在目前位置。
  • putback:
    • 調用形式cin.putback(ch)。
    • 将前面用get或者getline函數從輸入流讀入的字元ch傳回到輸入流,插入目前指針位置。
  • ignore:
    • 調用方式cin.ignore(n, 終止字元),
    • 預設cin.ignore(),n為1,終止符預設為EOF。跳過輸入流中的n個字元,或者遇到指定終止字元時提前結束。

參考文章: 輸入輸出流(一)