時間: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,返回osis.ignore(size,delim); //讀取並忽略最多size個字符,包括delim,與其他未格式化函數不同,ignore有默認參數,size默認值為1,delim的默認值為文件尾。get和getline有類似的行為,差別在於get將分隔符留作istream中的下一個字符,而getline則讀取並丟棄分隔符。無論哪個函數都不會將分隔符保存在sink中。
---------------------------------------------------------------------
九、確定讀取了多少個字符
某些操作從輸入讀取未知個數的字節,可以調用gcount來確定最後一個未格式化輸入操作讀取了多少個字符。將字符退回流的單字符操作也屬於未格式化輸入操作。如果在調用gcout之前調用了peek、unget或putback,則gcount的返回值為0 。