C++編程中的格局化輸入詳解。本站提示廣大學習愛好者:(C++編程中的格局化輸入詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++編程中的格局化輸入詳解正文
在輸入數據時,為輕便起見,常常不指定輸入的格局,由體系依據數據的類型采用默許的格局,但有時願望數據按指定的格局輸入,如請求以十六進制或八進制情勢輸入一個 整數,對輸入的小數只保存兩位小數等。有兩種辦法可以到達此目標。一種是應用掌握符的辦法;第2種是應用流對象的有關成員函數。分離論述以下。
應用掌握符掌握輸入格局
掌握格局的應用辦法這裡不再贅述,僅舉例解釋
[例] 用掌握符掌握輸入格局。
#include <iostream> #include <iomanip>//不要忘卻包括此頭文件 using namespace std; int main() { int a; cout<<"input a:"; cin>>a; cout<<"dec:"<<dec<<a<<endl; //以十進制情勢輸入整數 cout<<"hex:"<<hex<<a<<endl; //以十六進制情勢輸入整數a cout<<"oct:"<<setbase(8)<<a<<endl; //以八進制情勢輸入整數a char *pt="China"; //pt指向字符串"China" cout<<setw(10)<<pt<<endl; //指定域寬為,輸入字符串 cout<<setfill('*')<<setw(10)<<pt<<endl; //指定域寬,輸入字符串,空白處以'*'填充 double pi=22.0/7.0; //盤算pi值 //按指數情勢輸入,8位小數 cout<<setiosflags(ios::scientific)<<setprecision(8); cout<<"pi="<<pi<<endl; //輸入pi值 cout<<"pi="<<setprecision(4)<<pi<<endl; //改成位小數 cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl; //改成小數情勢輸入 return 0; }
運轉成果以下:
input a:34↙(輸出a的值) dec:34 (十進制情勢) hex:22 (十六進制情勢) oct:42 (八進制情勢) China (域寬為) *****China (域寬為,空白處以'*'填充) pi=3.14285714e+00 (指數情勢輸入,8位小數) pi=3.1429e+00 (指數情勢輸入,4位小數) pi=3.143 (小數情勢輸入,精度仍為)
用流對象的成員函數掌握輸入格局
除可以用掌握符來掌握輸入格局外,還可以經由過程挪用流對象cout頂用於掌握輸入格局的成員函數來掌握輸入格局。用於掌握輸入格局的經常使用的成員函數見表
流成員函數setf和掌握符setiosflags括號中的參數表現格局狀況,它是經由過程格局標記來指定的。格局標記在類ios中被界說為列舉值。是以在援用這些格局標記時要在後面加上類名ios和域運算符“::”。格局標記見下表
[例] 用流掌握成員函數輸入數據。
#include <iostream> using namespace std; int main( ) { int a=21 cout.setf(ios::showbase);//顯示基數符號(0x或) cout<<"dec:"<<a<<endl; //默許以十進制情勢輸入a cout.unsetf(ios::dec); //終止十進制的格局設置 cout.setf(ios::hex); //設置以十六進制輸入的狀況 cout<<"hex:"<<a<<endl; //以十六進制情勢輸入a cout.unsetf(ios::hex); //終止十六進制的格局設置 cout.setf(ios::oct); //設置以八進制輸入的狀況 cout<<"oct:"<<a<<endl; //以八進制情勢輸入a cout.unseft(ios::oct); char *pt="China"; //pt指向字符串"China" cout.width(10); //指定域寬為 cout<<pt<<endl; //輸入字符串 cout.width(10); //指定域寬為 cout.fill('*'); //指定空白處以'*'填充 cout<<pt<<endl; //輸入字符串 double pi=22.0/7.0; //輸入pi值 cout.setf(ios::scientific); //指定用迷信記數法輸入 cout<<"pi="; //輸入"pi=" cout.width(14); //指定域寬為 cout<<pi<<endl; //輸入pi值 cout.unsetf(ios::scientific); //終止迷信記數法狀況 cout.setf(ios::fixed); //指定用定點情勢輸入 cout.width(12); //指定域寬為 cout.setf(ios::showpos); //負數輸入“+”號 cout.setf(ios::internal); //數符湧現在左邊 cout.precision(6); //保存位小數 cout<<pi<<endl; //輸入pi,留意數符“+”的地位 return 0; }
運轉情形以下:
dec:21(十進制情勢) hex:0x15 (十六進制情勢,以x開首) oct:025 (八進制情勢,以開首) China (域寬為) *****China (域寬為,空白處以'*'填充) pi=**3.142857e+00 (指數情勢輸入,域寬,默許位小數) +***3.142857 (小數情勢輸入,精度為,最左邊輸入數符“+”)
對法式的幾點解釋:
1) 成員函數width(n)和掌握符setw(n)只對厥後的第一個輸入項有用。如:
cout. width(6); cout <<20 <<3.14<<endl;
輸入成果為 203.14
在輸入第一個輸入項20時,域寬為6,是以在20後面有4個空格,在輸入3.14時,width (6)已不起感化,此時按體系默許的域寬輸入(按數據現實長度輸入)。假如請求在輸入數據時都按指定的統一域寬n輸入,不克不及只挪用一次width(n),而必需在輸入每項前都挪用一次width(n>,下面的法式中就是如許做的。
2) 在表中的輸入格局狀況分為5組,每組中同時只能選用一種(例如dec、hex和oct中只能選一,它們是相互排擠的)。在用成員函數setf和掌握符setiosflags設置輸入格局狀況後,假如想改設置為同組的另外一狀況,應該挪用成員函數unsetf(對應於成員函數self)或resetiosflags(對應於掌握符setiosflags),先終止本來設置的狀況。然後再設置其他狀況,年夜家可以從本法式中看到這點。法式在開端固然沒有效成員函數self和掌握符setiosflags設置用dec輸入格局狀況,但體系默許指定為dec,是以要轉變為hex或oct,也應該先用unsetf 函數終止本來設置。假如刪去法式中的第7行和第10行,固然在第8行和第11行頂用成員函數setf設置了hex和oct格局,因為未終止dec格局,是以hex和oct的設置均不起感化,體系仍然以十進制情勢輸入。
同理,法式倒數第8行的unsetf 函數的挪用也是弗成缺乏的。
3) 用setf 函數設置格局狀況時,可以包括兩個或多個格局標記,因為這些格局標記在ios類中被界說為列舉值,每個格局標記以一個二進位代表,是以可以用位或運算符“|”組合多個格局標記。如倒數第5、第6行可以用上面一行取代:
cout.setf(ios::internal I ios::showpos); //包括兩個狀況標記,用"|"組合
4) 可以看到:對輸入格局的掌握,既可以用掌握符,也能夠用cout流的有關成員函數,兩者的感化是雷同的。掌握符是在頭文件iomanip中界說的,是以用掌握符時,必需包括iomanip頭文件。cout流的成員函數是在頭文件iostream 中界說的,是以只需包括頭文件iostream,不用包括iomanip。很多法式人員覺得應用掌握符便利簡略,可以在一個cout輸入語句中持續應用多種掌握符。