C++輸出格式控制

C++輸出格式控制

在輸出數(shù)據(jù)時,為簡便起見,往往不指定輸出的格式,由系統(tǒng)根據(jù)數(shù)據(jù)的類型采取默認(rèn)的格式,但有時希望數(shù)據(jù)按指定的格式輸出,如要求以十六進(jìn)制或八進(jìn)制形式輸出一個整數(shù),對輸出的小數(shù)只保留兩位小數(shù)等。有兩種方法可以達(dá)到此目的:

  • 使用控制符
  • 使用流對象的有關(guān)成員函數(shù)

使用控制符控制輸出格式

C++提供了在輸入輸出流中使用的控制符(有的書中稱為操縱符)。如下表:

輸入輸出流的控制符

需要注意的是: 如果使用了控制符,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件。
例子如下:

#include <iostream>
#include <iomanip>//不要忘記包含此頭文件
using namespace std;
int main()
{
   int a;
   cout<<"input a:";
   cin>>a;
   cout<<"dec:"<<dec<<a<<endl;  //以十進(jìn)制形式輸出整數(shù)a
   cout<<"hex:"<<hex<<a<<endl;  //以十六進(jìn)制形式輸出整數(shù)a
   cout<<"oct:"<<setbase(8)<<a<<endl;  //以八進(jìn)制形式輸出整數(shù)a
   //setbase()是用來設(shè)置進(jìn)制的
   char *pt="China";  //pt指向字符串"China"
   cout<<setw(10)<<pt<<endl;  //指定域?qū)挒?輸出字符串
   cout<<setfill('*')<<setw(10)<<pt<<endl;  //指定域?qū)?輸出字符串,空白處以'*'填充
   double pi=22.0/7.0;  //計算pi值
   //按指數(shù)形式輸出8位小數(shù)
   cout<<setiosflags(ios::scientific)<<setprecision(8);
   cout<<"pi="<<pi<<endl;  //輸出pi值
   cout<<"pi="<<setprecision(4)<<pi<<endl;  //改為4位小數(shù)
   cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;  //改為小數(shù)形式輸出
   return 0;
}

運行結(jié)果如下:

input a:34↙             (輸入a的值)
dec:34                   (十進(jìn)制形式)
hex:22                   (十六進(jìn)制形式)
oct:42                   (八進(jìn)制形式)
     China               (域?qū)挒?0)
*****China               (域?qū)挒?0,空白處以'*'填充)
pi=3.14285714e+00        (指數(shù)形式輸出,8位小數(shù))
pi=3.1429e+00            (指數(shù)形式輸出,4位小數(shù))
pi=3.143                 (小數(shù)形式輸出,精度仍為4)

如果在多個cout語句中使用相同的setw(n),并使用setiosflags(ios::right),可以實現(xiàn)各行數(shù)據(jù)右對齊,如果指定相同的精度,可以實現(xiàn)上下小數(shù)點對齊。
例子如下:

#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
  double a=123.456,b=3.14159,c=-3214.67;
  cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2);
  cout<<setw(10)<<a<<endl;
  cout<<setw(10)<<b<<endl;
  cout<<setw(10)<<c<<endl;
  return 0;
}

運行結(jié)果如下:

    123.46 (字段寬度為10,右對齊,取兩位小數(shù))
      3.14
  -3214.67

先統(tǒng)一設(shè)置定點形式輸出、取兩位小數(shù)、右對齊。這些設(shè)置對其后的輸出均有效(除非重新設(shè)置),而setw只對其后一個輸出項有效,因此必須在輸出a,b,c之前都要寫setw(10)。

用流對象的成員函數(shù)控制輸出格式

除了可以用控制符來控制輸出格式外,還可以通過調(diào)用流對象cout中用于控制輸出格式的成員函數(shù)來控制輸出格式。用于控制輸出格式的常用的成員函數(shù)見下表:

用于控制輸出格式的流成員函數(shù)

流成員函數(shù)setf和控制符setiosflags括號中的參數(shù)表示格式狀態(tài),它是通過格式標(biāo)志來指定的。格式標(biāo)志在類ios中被定義為枚舉值。因此在引用這些格式標(biāo)志時要在前面加上類名ios和域運算符“::”。格式標(biāo)志見下表:

設(shè)置格式狀態(tài)的格式標(biāo)志

例子如下:

#include <iostream>
using namespace std;
int main( )
{
   int a=21;
   cout.setf(ios::showbase);      //顯示基數(shù)符號(0x或)
   cout<<"dec:"<<a<<endl;         //默認(rèn)以十進(jìn)制形式輸出a
   cout.unsetf(ios::dec);         //終止十進(jìn)制的格式設(shè)置
   cout.setf(ios::hex);           //設(shè)置以十六進(jìn)制輸出的狀態(tài)
   cout<<"hex:"<<a<<endl;         //以十六進(jìn)制形式輸出a
   cout.unsetf(ios::hex);         //終止十六進(jìn)制的格式設(shè)置
   cout.setf(ios::oct);           //設(shè)置以八進(jìn)制輸出的狀態(tài)
   cout<<"oct:"<<a<<endl;         //以八進(jìn)制形式輸出a
   cout.unsetf(ios::oct);
   char *pt="China";              //pt指向字符串"China"
   cout.width(10);                //指定域?qū)挒?0
   cout<<pt<<endl;                //輸出字符串
   cout.width(10);                //指定域?qū)挒?0
   cout.fill('*');                //指定空白處以'*'填充
   cout<<pt<<endl;                //輸出字符串
   double pi=22.0/7.0;            //輸出pi值
   cout.setf(ios::scientific);    //指定用科學(xué)記數(shù)法輸出
   cout<<"pi=";                   //輸出"pi="
   cout.width(14);                //指定域?qū)挒?4
   cout<<pi<<endl;                //輸出pi值
   cout.unsetf(ios::scientific); //終止科學(xué)記數(shù)法狀態(tài)
   cout.setf(ios::fixed);        //指定用定點形式輸出
   cout.width(12);               //指定域?qū)挒?2
   cout.setf(ios::showpos);      //正數(shù)輸出“+”號
   cout.setf(ios::internal);     //數(shù)符出現(xiàn)在左側(cè)
   cout.precision(6);            //保留6位小數(shù)
   cout<<pi<<endl;               //輸出pi,注意數(shù)符“+”的位置
   return 0;
}

運行結(jié)果如下:

dec:21                   (十進(jìn)制形式)
hex:0x15                 (十六進(jìn)制形式,以x開頭)
oct:025                  (八進(jìn)制形式,以開頭)
         China           (域?qū)挒?0)
*****China               (域?qū)挒?0,空白處以'*'填充)
pi=**3.142857e+00        (指數(shù)形式輸出,域?qū)挒?4,默認(rèn)6位小數(shù))
+***3.142857             (小數(shù)形式輸出,精度為7,最左側(cè)輸出數(shù)符“+”)

特別注意:

  • C++默認(rèn)的流輸出數(shù)值有效位是6,所以不管數(shù)據(jù)是多少,都只輸出六位。
  • 成員函數(shù)width(n)和控制符setw(n)只對其后的第一個輸出項有效。
  • 在上表中輸出格式狀態(tài)分為5組,每一組中同時只能選用一種(例如dec、hex和oct中只能選一,它們是互相排斥的)。在用成員函數(shù)setf和控制符setiosflags設(shè)置輸出格式狀態(tài)后,如果想改設(shè)置為同組的另一狀態(tài),應(yīng)當(dāng)調(diào)用成員函數(shù)unsetf(對應(yīng)于成員函數(shù)self)或resetiosflags(對應(yīng)于控制符setiosflags),先終止原來設(shè)置的狀態(tài),然后再設(shè)置其他狀態(tài)。程序在開始雖然沒有用成員函數(shù)self和控制符setiosflags設(shè)置用dec輸出格式狀態(tài),但系統(tǒng)默認(rèn)指定為dec,因此要改變?yōu)閔ex或oct,也應(yīng)當(dāng)先用unsetf 函數(shù)終止原來設(shè)置。如果刪去程序中的第7行和第10行,雖然在第8行和第11行中用成員函數(shù)setf設(shè)置了hex和oct格式,由于未終止dec格式,因此hex和oct的設(shè)置均不起作用,系統(tǒng)依然以十進(jìn)制形式輸出。
  • 用setf 函數(shù)設(shè)置格式狀態(tài)時,可以包含兩個或多個格式標(biāo)志,由于這些格式標(biāo)志在ios類中被定義為枚舉值,每一個格式標(biāo)志以一個二進(jìn)位代表,因此可以用位或運算符“|”組合多個格式標(biāo)志。如倒數(shù)第5、第6行可以用下面一行代替:
    cout.setf(ios::internal I ios::showpos);  //包含兩個狀態(tài)標(biāo)志,用"|"組合
  • 對輸出格式的控制,既可以用控制符,也可以用cout流的有關(guān)成員函數(shù),二者的作用是相同的??刂品窃陬^文件iomanip中定義的,因此用控制符時,必須包含iomanip頭文件。cout流的成員函數(shù)是在頭文件iostream 中定義的,因此只需包含頭文件iostream,不必包含iomanip。許多程序人員感到使用控制符方便簡單,可以在一個cout輸出語句中連續(xù)使用多種控制符。

參考資料:C++格式化輸出,C++輸出格式控制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容