程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中的IO庫(五)

C++中的IO庫(五)

編輯:C++入門知識

時間:2014.03.22

地點:基地

---------------------------------------------------------------------

一、指定浮點數計數法

最佳實踐:除非你需要控制浮點數的表示形式,比如按列打印數據或打印表示金額或百分比的數據),否則由標准庫選擇計數法是最好的方式。

同樣的道理,通過使用操縱符可以控制流使用科學計數法、定點十進制或十六進制計數。這些操縱符總結如下:

scientific 改變流的狀態使用科學計數法

fixed 改變流的狀態使用定點十進制

hexfloat 強制浮點數使用十六進制格式

defaultfloat 將流恢復到默認狀態(根據要打印的值選擇計數法)

---------------------------------------------------------------------

二、打印小數點

默認情況當浮點值得小數部分為0時不顯示小數點,showpoint操縱符強制打印小數點;noshowpoint則恢復默認行為。比如:

cout<

---------------------------------------------------------------------

三、輸出補白

setw 指定下一個數字或字符串值得最小空間,例:setw(12) 將在輸出中至少流出12個位置供下一個輸出占據

left 左對齊輸出

right 右對齊輸出,默認格式

interal 控制負數的符號的位置,左邊符號對齊,右對值對齊,用空格填滿所有中間空間

setfii 允許指定一個字符代替默認的空格來補白輸出。例:setfill('#')

下面在來總結下定義在頭文件iomanip中的操縱符,有:

setfill(ch) 用字符ch填充空白

setprecision(n) 將浮點精度設置為n

setw(w) 讀或者寫值得寬度為w個字符

setbase(b) 將整數輸出為b進制

---------------------------------------------------------------------

四、控制輸入格式

默認情況下,輸入運算符會忽略空白符(空格符、制表符、換行符、回車符)而操縱符noskipws則會令輸入運算符讀取空白符而不是跳過,恢復默認行為則再使用skipws操縱符,比如:

char ch;
while(cin>>ch){
    cout<輸入:

a b d

d

循環執行 4次

cin>>noshipws;  //現在設置cin讀取空白符
while(cin>>ch)
  cout<>skipws;  //將cin恢復到默認狀態,丟棄空白符

和前一樣用相同的輸入時,循環會執行7次(4個普通字符,一個空格字符,一個制表符,一個回車符)

---------------------------------------------------------------------

五、未格式化的輸入/輸出操作

未格式化IO操作運允許我們將一個流當做一個無解釋的字節序列來處理。比如我們可以使用未格式化IO操作get和put來讀取和寫入一個字符:

char ch;
while(cin.get(ch))
  cout.put(ch);
這種未格式化的IO操作執行於底層操作之上,不會忽略任何字符。單字節底層IO操作總結如下:

is.get(ch) 從istream is流中讀取下一個字節存入字符ch中,返回is流

os.put(ch) 將字符ch輸出到ostream os,返回os流

is.get() 將is流的下一個字節作為int返回

is.putback(ch) 將字符ch放回is流中,返回is

is.unget() 將is向後移動一個字節,返回is流

is.peek() 將下一個字節作為int返回,但不從流中刪除它

---------------------------------------------------------------------

六、將字符放回輸入流

有三種方法:

1.peek方法返回輸入流中下一個字符的副本,但不會將它從流中刪除,peek返回的值仍然在流中

2.unget使得輸入流向後移動一個字節

3.putback退回從流中讀取的最後一個值,接受一個參數,但此參數必須與最後讀取的值相同

---------------------------------------------------------------------

七、從輸入操作返回的int值

函數peek和無參的get都以int類型從輸入流返回一個字符。但為何不用char顯得更自然呢,原因是:返回int可以返回文件尾標記,char范圍中的每個值表示一個真實字符,因此范圍中沒有額外的值可用來表示文件尾。返回int的函數先將返回的字符轉換為unsigned char,然後在將結果提升到int。因此即使字符集中友字符映射到負值,這些操作返回的int也是正值。而標准庫使用負值表示文件尾,這樣就可以保證與任何合法字符的值都不同。頭文件cstdio定義了一個名為EOF的const,可用來檢測從get返回的值是否是文件尾,而不必記憶表示文件尾的實際數值。

int ch;  //使用一個int而不是一個char來保存get()的返回值
while( (ch=cin.get() )!=EOF)
  cout.put(ch);

---------------------------------------------------------------------

八、多字節操作

如果速度是考慮的重點,那麼使用未格式化IO操作一次處理大塊數據是很有必要的。總結如下:

is.get(sink,size,delim)

從is流中最多讀取size個字節,並保存在字符數組中,字符數組的起始地址由sink給出,讀取過程直至遇到字符delim或讀取了size個字節或遇到文件尾時停止。如果遇到的是delim,則將其留在輸入流中,不讀取出來存入sink中。

is.getline(sink,size,delim);           //和上述get類似
is.read(sink,size);                //讀取最多size個字節,存入字符數組sink中,返回is流
is.gcount();               //返回上一個未格式化讀取操作從is讀取的字節數
os.write(source,size);     //將字符數組source中的size個字節寫入os,返回os
is.ignore(size,delim);     //讀取並忽略最多size個字符,包括delim,與其他未格式化函數不同,ignore有默認參數,size默認值為1,delim的默認值為文件尾。
get和getline有類似的行為,差別在於get將分隔符留作istream中的下一個字符,而getline則讀取並丟棄分隔符。無論哪個函數都不會將分隔符保存在sink中。

---------------------------------------------------------------------

九、確定讀取了多少個字符

  某些操作從輸入讀取未知個數的字節,可以調用gcount來確定最後一個未格式化輸入操作讀取了多少個字符。將字符退回流的單字符操作也屬於未格式化輸入操作。如果在調用gcout之前調用了peek、unget或putback,則gcount的返回值為0 。








  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved