C++ setw:格式化輸出(詳解版)

2020-07-16 10:04:36
可以使用幾種不同的方式列印或顯示相同的資料。例如,以下數位雖然看起來不一樣,但是它們都具有相同的值。

720
720.0
720.00000000
7.2E+ 2
720.0

列印值的方式稱為格式化。cout 物件具有格式化每種資料型別變數的標準方式。當然,有時候需要對資料顯示的方式進行更多的控制。例如,下面程式顯示了 3 行數位,每行之間都有空格。
// This program displays three rows of numbers.
#include <iostream>
using namespace std;

int main()
{
    int num1 = 2897, num2 = 5, num3 = 837,
    num4 = 34, num5 = 7, num6 = 1623,
    num7 = 390, num8 = 3456, num9 = 12;
    // Display the first row of numbers
    cout << num1 << " " << num2 << " " << num3 << endl;
    // Display the second row of numbers
    cout << num4 << " " << num5 << " " << num6 << endl;
    // Display the third row of numbers
    cout << num7 << " " << num8 << " " << num9 << endl;
    return 0;
}
程式輸出結果:

2897 5 837
34 7 1623
390 3456 12

美中不足的是,數位未能按列對齊。這是因為一些數位(如 5 和 7)在螢幕上佔據一個位置,而其他數位佔據兩到三個位置。cout 僅使用列印每個數位所需的空格數。

為了彌補這一點,cout 提供了一種指定每個號碼使用的最小空格數量的方法。流操作符 setw 可用於建立指定寬度的列印區域。以下是其用法範例:

value = 23;
cout << setw(5) << value;

單詞 setw 後面括號內的數位表示緊隨其後的值的欄位寬度。欄位寬度是螢幕上列印值的字元位置或空格的最小數量。在此範例中,數位 23 將顯示在 5 個空格的欄位中。

為了進一步解釋其工作原理,請看以下語句:

value = 23;
cout << "(" << setw(5) << value << ")";

這將產生以下輸出:

(   23)

請注意,這個數位佔據了欄位的最後兩個位置。由於這個數位沒有使用整個欄位,所以 cout 用空格填充了額外的 3 個位置。因為這個數位出現在欄位的右側,空格“填充”在前面,所以它被認為是右對齊的。

下面的程式顯示了如何通過使用 setw 來將之前程式中的數位列印在完美排列的列中。另外,由於程式使用 setw(6),最大的數位有 4 位,所以數位將被分開,而不必在數位之間列印一個包含空格的字串文字。
// This program uses setw to display three rows of numbers so they align.
#include <iostream>
#include <iomanip>// Header file needed to use setw
using namespace std;

int main()
{
    int num1 = 2897, num2 = 5, num3 = 837,
    num4 = 34, num5 = 7, num6 = 1623,
    num7 = 390, num8 = 3456, num9 = 12;
    // Display the first row of numbers
    cout << setw(6) << num1 << setw(6) << num2 << setw(6) << num3 << endl;
    //Display the second row of numbers
    cout << setw(6) << num4 << setw(6) << num5 << setw(6) << num6 << endl;
    // Display the third row of numbers
    cout << setw(6) << num7 << setw(6) << num8 << setw(6) << num9 << endl;
    return 0;
}
程式輸出結果:
2897       5   837
34         7  1623
390     3456    12
注意,在程式第 3 行的 #include 指令中命名了一個新的標頭檔案 iomanip。該檔案必須包含在使用 setw 的任何程式中。

請注意,setw 操作符要與每個值一起使用,這是因為 setw 只為緊隨其後的值建立一個欄位寬度。列印該值後,cout 將回到其預設的列印方式。如果數位太大導致欄位無法完全容納,那會怎麼祥呢?如下列語句所示:

value = 18397;
cout << setw(2) << value;

在這種情況下,cout 將列印整個數位,因為 setw 只指定了列印欄位中最少的位置數。任何需要比指定最小值大的欄位的數位將導致 cout 覆蓋 setw 值。

可以為任何型別的資料指定欄位寬度。下面的程式顯示了與整數、浮點數及字串物件一起使用的 setw。
// This program demonstrates the setw manipulator
//being used with variables of various data types.
#include <iostream>
#include <iomanip> // Header file needed to use setw
#include <string> // Header file needed to use string objects
using namespace std;

int main()
{
    int intValue = 3928;
    double doubleValue = 91.5;
    string stringValue = "Jill Q. Jones";
    cout << "(" << setw (5) << intValue << ")" << endl;
    cout << "(" << setw (8) << doubleValue << ")" << endl;
    cout << "(" << setw (16) << stringValue << ")" << endl;
    return 0;
}
程式輸出結果:
( 3928)
(   91.5)
(  Jill Q. Jones)
此程式說明了一些要點:
  • 浮點數的欄位寬度包括小數點的位置。
  • 字串的欄位寬度包括字串中的所有字元,包括空格。
  • 預設情況下,該欄位中列印的值為右對齊。這意味著它與列印欄位的右側對齊,並且必要時在值前填充空格。