關於C 的cout的格式化輸出

2021-08-13 04:19:57 字數 3887 閱讀 7404

今天呢,有人問我關於乙個c++浮點數輸出精度的問題,畢竟到現在我也還沒怎麼去考量那些操作符,也就一時沒答上來,查了一下,回答了那個問題,也順便做個整理,整體的關於那些輸出的manipulator。

首先是那個不太對的**

#include #include using namespace std;

int main()

她後面的期望輸出呢是6位有效數字,然而呢,shell只把乙個3.3和另乙個2輸出就好了

輸出:

3.2999999999999998

3.14

1.008

2

為了揭示這背後只有乙個的真相呢,我呼叫我的上課時間,關於c++的格式化輸出進行了一些網路上的查詢,然而,效果不好。

好不容易探明了這古怪的真相——輸出流輸出的時候把你最後的零吃掉了啦!!!那個可愛的setprecision(n)函式只是使後面的保證輸出的有效數字不超過n罷了,真正要把零顯示出還是要靠可愛的showpoint:

cout << showpoint << setprecision(6) << pi << endl;

輸出:

3.2999999999999998

3.14000

1.00800

2.00000

這就符合要求了嘛。

順著這個,我們繼續探索一些其他的manipulator。

現在第一小組入場了,看吶,他們揮舞著手中的小彩旗,盡顯年輕風采,鬥志…(啪)

第一小組

操作符作用ends

cout清空輸出流

endl

換行並flush,嗯,等價於cout << '\n' << flush

首先是ends

cout << showpoint << setprecision(6) << pi << ends << 2.1 << '\0' << 2.1 << 2.1;
輸出:
3.14000 2.10000 2.100002.10000inserts a null character.

本來也想搞個flush的例子的,但,根本沒……,暫時想不到什麼把東西塞進流不讓他輸出然後清空他的辦法

endl太常用,算了。

接下來進場的是第二小組!它們有著神奇的化身,他們一位兩體!(啪)

第二小組

流成員函式

對應控制符

特效precision(int)

setprecision(int)

設定浮點數十進位制精度值

width(int)

setw(int)

設定字段寬度(僅下乙個輸出)

fill(char)

setfill(char)

設定填充字元

setf(int)

setiosflags(int)

設定格式標誌(後面會提到各類格式表示)

unsetf(int)

resetiosflags(int)

取消某格式標誌的設定

precision在最初已經用過了,下面幾個讓我們依次玩一玩。

const double pi = 3.14;

const double p = 3.3;

double i = 2;

cout.width(6);

cout << pi << endl;

cout << setw(8) << p << endl;

cout << setfill('*') << setw(7) << i << endl;

輸出為:
3.14

3.32******2

很可愛吧!預設佔位符為空,並且setw是只能應用到下乙個輸出的,然後數一數輸出的空和數字小數點,加起來一共就是6個,8個,7個字元了呢。

cout << setiosflags(ios::left) << setw(10) << pi << endl;

cout << resetiosflags(ios::left) << setw(10) << pi << endl;

輸出為
3.14******

******3.14

看!佔位符到後面了,這裡就用了乙個格式標誌ios::left,一取消,又到前面了,格式標誌後面會介紹的

第三小組!!

識別符號(其實也幾乎全是格式標誌,只要前面加個ios::)

特效(duangduangduang)

boolalpha / noboolalpha

將之後的布林型別值輸出為true/false

showbase / noshowbase

強制輸出整數的基數

showpoint / noshowpoint

強制輸出省略的零和小數點

showpos / noshowpos

強制輸出+

unitbuf / nounitbuf

每次輸出後自動flush

uppercase / nouppercase

輸出十六進製制時,abcdef大寫

dec / hex / oct

強行改整數輸出進製

fixed / scientific / hexfloat / defaultfloat

強行輸出為:定點小數,科學記數法,十六進製制浮點數,預設浮點數輸出格式

left/right/internal(補一行)

你知道的啦,左對齊右對齊什麼的,最後那個是符號左對齊,數字右對齊

遊戲開始!

bool tru = true, fals = false;

cout << boolalpha << tru << 1 << endl << fals << endl;

輸出
true1

false

**:
cout << hex << 13 << endl << showbase << 13 << endl << oct << 143 << endl;
輸出:
d

0xd0217

**:
cout << setprecision(9) << pi << endl;

cout << showpoint << pi << endl;

cout << i << endl;

cout << noshowpoint << pi << endl;

cout << i << endl;

輸出
3.14

3.14000000

2.00000000

3.14

2

**:
cout << pi << endl;

cout << showpos << pi << endl;

cout << 1.008 << endl;

輸出:

3.14

+3.14

+1.008

最後測一下fixed什麼的

cout << fixed << pi << endl;

cout << scientific << pi << defaultfloat << endl;

cout << hexfloat << pi << endl;

輸出:
3.140000

3.140000e+000

0x1.91eb85p+1

喵喵喵?那個浮點十六進製制數我看不懂你啊。

ok,就這樣吧,也挺全了,應該吧

cout格式化輸出 C

由於class ifstream ofstream分別為class istream ostream派生來的,所以,下面介紹的cout輸出的格式化,在檔案的輸出時使用方法相同。由於使用iostream工具來設定一些格式值不太方便,為簡化工作,c 在標頭檔案iomanip中提供了一些控制符,他們能夠提供...

cout格式化輸出

在使用setf等庫函式時使用 在使用流操縱運算元時使用 using namespace std 以下所有的setf 都有對應的unsetf 用於取消設定 所有的setiosflags 可以用resetiosflags 取消 標誌位fmtflags的命名空間可以使用ios base 或者ios int...

cout格式化輸出

需要引入的標頭檔案 include在使用流操縱運算元時使用 int laneri 12345 double lanerd 56789 1 設定整數進製輸出 過載1 fmtflags ios base setf fmtflags mask 過載2 fmtflags ios base setf fmtf...