C++輸入輸出的格式控制1
》預設的輸入輸出格式
在沒有特地進行格式控制的情況下,輸入輸出採用預設格式。
>預設的輸入格式
C++流所識別的輸入資料的型別及其預設的輸入格式:
# short 、int 、long(signed 、unsigned):與整型常量同
# float 、double 、long double:與浮點數常量同
# char(signed 、unsigned):第一個非空白字元
# char *(signed 、unsigned):從第一個非空白字元開始到下一個空白字元結束
# void *:無字首的16進位制數
# bool:把true或1識別為true,其他的均識別為false(VC6.0中把0識別為false,其他的值均識別為true)
示 例:執行
int a,b; char c; char d[30];
cin>>a>b>>c>>d; 時,若輸入
123 456abcd efg
則a的值為123,b的值為456,c的值為‘a’,d的值為“bcd”。
>預設的輸出格式
C++流所識別的輸出資料的型別及其預設的輸出格式:
# char(signed 、unsigned):單個字元(無引號)
# short 、int 、long(signed 、unsigned):一般整型形式,負數前有-號
# char *(signed 、unsigned):字元序列(無引號)
# float 、double 、long double:浮點格式或指數格式(科學表示法),取決於哪個更短
# void *:無字首的16進位制數
# bool:1或0
示 例:執行
char c='A',*p="hello!";
cout<<123<<c<<-123<<endl;
cout<<p<<(void *)p;
將輸出:
123A-123
hello!0041B18C
注:0041B18C是變數p的十六進位制地址。在不同環境下執行上面的語句,該值可能不同。
》格式標誌與格式控制
在作為流庫根類的ios_base中,有一個作為資料成員的格式控制變數,專門用來記錄格式標誌;通過設定標誌,可以有意識地對格式輸入輸出的效果加以控制。各種格式標誌被定義為一組符號常量。
在輸入輸出的格式控制中,大部分是通過設定格式標誌實現的,也可以通過使用專用的操作符進行設定。在下面的與專用操作符進行格式控制等效的格式控制函式中,在表示函式呼叫格式時,i表示任意的輸入流物件,o表示任意的輸出流物件,io表示任意的輸入流物件或輸出流物件。
》輸入輸出寬度的控制
寬度設定用於輸入時,只對字串有效,輸出時指最小輸出寬度。當實際資料寬度小於指定的寬度時,多餘的位置用填充字元(通常是空格)填滿;當實際資料的寬度大於設定的寬度時,扔按實際的寬度輸出。初始寬度值為0,其含義是所有資料都按實際寬度輸出。與寬度設定有關的操作符是
# setw(int n):設定輸入輸出的寬度。
等價函式呼叫為:io.width(n)
其中n為一個表示寬度的表示式。如果用於字串輸入,實際輸入的字串的最大長度為n-1.也就是說寬度n連字串結束符也包含在內。函式width返回此前設定的寬度。
注:寬度設定的效果只對一次輸入或輸出有效,在完成了一個數據的輸入或輸出後,寬度設定自動恢復為0(表示按資料實際寬度輸入輸出)。寬度設定是所有格式設定中唯一的一次有效的設定。
示 例:
cout<<123<<endl;
cout.width(10); cout<<123<<456<<endl;
cout<<setw(10)<<123<<setw(10)<<456;
輸出結果為:
123
123456
123 456
》浮點數輸出方式的控制
在初始狀態下,浮點數按浮點格式輸出,輸出精度是指有效位的個數,小數點的相對位置隨資料的不同而浮動;將浮點數改變為按定點格式或指數格式(科學表示法,如3.2156e+2)輸出時,輸出精度是指小數位數,小數點的相對位置固定不變,必要時進行舍入處理或新增無效0。浮點數輸出方式的設定一直有效,直到再次設定浮點數輸出方式時為止。
有關操作符:
# resetiosflags(ios_base::floatfield):(此為預設設定)浮點數按浮點格式輸出
等價函式呼叫:o.unsetf(ios_base::floatfield)
# fixed:浮點數按定點格式輸出
等價函式呼叫:o.setf(ios_base::fixed,ios_base::floatfield)
# scientific:浮點數按指數格式(科學表示法)輸出
等價函式呼叫:0.setf(ios_base::scientific,ios_base::floatfield)
示 例:
cout<<314.15926535<<endl;
cout<<fixed<<314.15926535<<endl;
cout<<scientific<<314.15926535<<endl;
將輸出:
314.159
314.159265
3.141593e+002
注:精度的預設值是6位。輸出的第一行說明,浮點數的預設格式為浮點格式,這種情況下精度的含義是有效位數。輸出第二行和第三行說明,對於定點格式和指數格式,精度的含義是小數位數。
》輸出精度的控制
輸入輸出的精度是針對浮點數設定的,其實際含義與浮點數輸出方式有關:如果採用浮點數格式,精度的含義是有效位數;如果採用定點格式或指標格式(科學表示法),精度的含義是小數位數。精度的設定用於輸出,預設值為6,可以通過設定改變精度;將精度值設定為0意味著回到預設精度6。精度值的設定一直有效,直到再次設定精度時為止。
有關操作符:
# setprecision(int n):設定浮點數的精度(有效位數或小數位數)
等價函式呼叫:io.precision(n)
其中n為表明精度值的表示式。函式precision返回此前設定的精度
示 例:
cout<<fixed<<1234.5678<<endl<<setprecision(2)<<1234.5678
將輸出:
12.345678
12.35
對輸出精度進行控制,並結合浮點數輸出方式和輸出寬度的控制,可以實現報表輸出中的小數點對齊。
示 例:顯示輸出一個兩位以內整數的平方根表
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
int i;
cout<<" |";
for(i=0;i<10;i++) cout<<setw(5)<<i<<" ";
cout<<endl<<"----+";
for(i=0;i<10;i++) cout<<"-------";
cout<<fixed<<setprecision(3);
for(i=0;i<10;i++){
cout<<endl<<setw(2)<<i<<" |";
for(int j=0;j<10;j++) cout<<setw(7)<<sqrt(i*10+j);
}
cout<<endl<<endl;
system("pause");
return 0;
}
程式執行結果: