使用插入的運算子,以及控制格式
本主題將說明如何控制格式以及如何建立您自己的類別的插入運算子。 插入 (<<) 運算子,這 preprogrammed 所有標準的 C++ 資料型別,會傳送至輸出資料流物件的位元組。 插入運算子使用預先定義 「 manipulators,「 它們是變更整數引數的預設格式的項目。
您可以控制的格式,使用下列選項:
輸出寬度
對齊方式
精確度
基數
輸出寬度
若要對齊輸出,您必須指定每個項目輸出寬度放置setw manipulator 資料流中,或藉由呼叫寬度成員函式。 本範例為靠右對齊的值,在 [資料行最小為 10 個字元寬:
// output_width.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
for( int i = 0; i < 4; i++ )
{
cout.width(10);
cout << values[i] << '\n';
}
}
Output
1.23
35.36
653.7
4358.24
您最多只能有 10 個字元寬時,會為任何值加入前置的空白。
若要需要而空欄位,請使用填滿成員函式,它可以設定的填補字元值的欄位具有指定的寬度。 預設值是空白的。 若要需要而空資料行的數字,並顯示星號,修改前一個的循環播放,如下所示:
for( int i = 0; i < 4; i++ )
{
cout.width( 10 );
cout.fill( '*' );
cout << values[i] << endl;
}
endl Manipulator 會取代新行字元 ('\n')。 輸出如下所示:
******1.23
*****35.36
*****653.7
***4358.24
若要在同一行中指定的資料元素的寬度,請使用setw manipulator:
// setw.cpp
// compile with: /EHsc
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
for( int i = 0; i < 4; i++ )
cout << setw( 6 ) << names[i]
<< setw( 10 ) << values[i] << endl;
}
Output
寬度 <iostream> 在宣告成員函式。 如果您使用setw或任何其他的 manipulator 引數,則必須包含 <iomanip>。 在輸出中,字串將列印於 6 寬度的欄位和欄位的寬度為 10 的整數:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
既不setw或寬度值會將其截斷。 如果格式化輸出超出寬度,列印完整的值,表示資料流的精確度設限於。 兩者都setw和寬度會影響下列欄位。 欄位寬度會還原成它的預設行為 (所需的寬度) 在列印一個欄位之後。 不過,其他的資料流格式選項都有效,除非變更。
對齊方式
輸出資料流處理預設為靠右對齊的文字。 若要靠左對齊前一範例中的名稱,並靠右對齊數字,取代的循環播放,如下所示:
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 ) << names[i]
<< resetiosflags( ios::left )
<< setw( 10 ) << values[i] << endl;
輸出如下所示:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
藉由設定 left-align 旗標 setiosflags 與 manipulator 左列舉值。 這個列舉值定義在 io 類別,因此它的參考必須包括 io:: 前置詞。 Resetiosflags manipulator 關閉 left-align 旗標。 不像寬度和setw,則程式setiosflags和resetiosflags是永久性的。
精確度
浮點有效位數的預設值會是六。 例如,數字 3466.9768 列印為 3466.98。 若要變更這個值會列印的方式,使用 setprecision manipulator。 Manipulator 有兩個旗標: 固定 和 科學。 如果固定設定為 3466.976800 數字的沖印。 如果科學設定,則會顯示為 3.4669773 + 003。
若要顯示所示的浮點數對齊 有一個重大的數字,以取代 的循環播放,如下所示:
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 )
<< names[i]
<< resetiosflags( ios::left )
<< setw( 10 )
<< setprecision( 1 )
<< values[i]
<< endl;
程式列印這份清單:
Zoot 1
Jimmy 4e+001
Al 7e+002
Stan 4e+003
若要消除科學標記法,插入此聲明,然後的迴圈:
cout << setiosflags( ios::fixed );
加上固定的標記法,程式會印以一個數字的小數點後。
Zoot 1.2
Jimmy 35.4
Al 653.7
Stan 4358.2
如果您變更 ios::fixed 的旗標 ios::scientific,程式會印這樣:
Zoot 1.2e+000
Jimmy 3.5e+001
Al 6.5e+002
Stan 4.4e+003
同樣地,程式會印有一個數字,小數點後面。 如果其中一個 ios::fixed 或 ios::scientific 設定,精確度值會決定於小數點後的小數位數。 如果都不會設定旗標,整數位數值會判斷有效位數的總次數。 resetiosflags Manipulator 清除這些旗標。
基數
年 12 月, 年 10 月,以及 十六進位 manipulators 設定預設基數輸入和輸出。 例如,如果您插入十六進位 manipulator 到輸出資料流物件正確地轉譯整數的內部資料表示,轉換為十六進位的輸出格式。 數字會顯示數字以 a 到 f 用小寫字母大寫旗標已清除 (預設); 否則,會以大寫。 預設的基數是年 12 月 (十進位)。