• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            統(tǒng)計(jì)

            • 隨筆 - 50
            • 文章 - 42
            • 評(píng)論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 166406
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            C++格式化輸出輸入 (stream)

            本文摘自C++primer第四版附錄A3

            A.3.3. 控制輸出格式

            許多操縱符使我們能夠改變輸出的外觀。有兩大類的輸出控制:控制數(shù)值的表示,以及控制填充符的數(shù)量和布局。

            控制布爾值和格式

            改變對(duì)象格式化狀態(tài)的操縱符的一個(gè)例子是 boolalpha 操縱符。默認(rèn)情況下,將 bool 值顯示為 1 或 0,true 值顯示為 1,而 false 值顯示為 0。可以通過流的 boolalpha 操縱符覆蓋這個(gè)格式化:

            cout << "default bool values: "
            << true << " " << false
            << "\nalpha bool values: "
            << boolalpha
            << true << " " << false
            << endl;

            執(zhí)行時(shí),這段程序產(chǎn)生下面的輸出:

            default bool values: 1 0
            alpha bool values: true false

            一旦將 boolalpha “寫”至 cout,從這個(gè)點(diǎn)起就改變了 cout 將怎樣顯示 bool 值,后續(xù)顯示 bool 值的操作將用 truefalse 進(jìn)行顯示。

            要取消 cout 的格式狀態(tài)改變,必須應(yīng)用 noboolalpha

            bool bool_val;
            cout << boolalpha // sets internal state of cout
            << bool_val
            << noboolalpha; // resets internal state to default formatting

            現(xiàn)在只改變 bool 值的格式化來顯示 bool_val,并且立即將流重置為原來的狀態(tài)。

            指定整型值的基數(shù)

            默認(rèn)情況下,用十進(jìn)制讀寫整型值。通過使用操縱符 hexoctdec,程序員可以將表示進(jìn)制改為八進(jìn)制、十六進(jìn)制或恢復(fù)十進(jìn)制(浮點(diǎn)值的表示不受影響):

            const int ival = 15, jval = 1024; // const, so values never change
            cout << "default: ival = " << ival
            << " jval = " << jval << endl;
            cout << "printed in octal: ival = " << oct << ival
            << " jval = " << jval << endl;
            cout << "printed in hexadecimal: ival = " << hex << ival
            << " jval = " << jval << endl;
            cout << "printed in decimal: ival = " << dec << ival
            << " jval = " << jval << endl;

            編譯和執(zhí)行的時(shí)候,程序產(chǎn)生下面的輸出:

            default: ival = 15 jval = 1024
            printed in octal: ival = 17 jval = 2000
            printed in hexadecimal: ival = f jval = 400
            printed in decimal: ival = 15 jval = 1024

            注意,像 boolalpha 一樣,這些操縱符改變格式狀態(tài)。它們影響緊接在后面的輸出,以及所有后續(xù)的整型輸出,直到通過調(diào)用另一操縱符重圍格式為止。

            指出輸出的基數(shù)

            默認(rèn)情況下,顯示數(shù)值的時(shí)候,不存在關(guān)于所用基數(shù)的可見記號(hào)。例如,20 是 20,還是 16 的八進(jìn)制表示?按十進(jìn)制模式顯示數(shù)值的時(shí)候,會(huì)按我們期待的格式打印數(shù)值。如果需要打印八進(jìn)制或十六進(jìn)制值,可能應(yīng)該也使用 showbase 操縱符。showbase 操縱符導(dǎo)致輸出流使用的約定,與指定整型常量基數(shù)所用的相同:

            • 以 0x 為前導(dǎo)表示十六進(jìn)制。

            • 以 0 為前導(dǎo)表示八進(jìn)制。

            • 沒有任何前導(dǎo)表示十進(jìn)制。

            修改程序使用 showbase 如下:

            const int ival = 15, jval = 1024; // const so values never change
            cout << showbase; // show base when printing integral values
            cout << "default: ival = " << ival
            << " jval = " << jval << endl;
            cout << "printed in octal: ival = " << oct << ival
            << " jval = " << jval << endl;
            cout << "printed in hexadecimal: ival = " << hex << ival
            << " jval = " << jval << endl;
            cout << "printed in decimal: ival = " << dec << ival
            << " jval = " << jval << endl;
            cout << noshowbase; // reset state of the stream

            修改后的輸出使得基礎(chǔ)值到底是什么很清楚:

            default: ival = 15 jval = 1024
            printed in octal: ival = 017 jval = 02000
            printed in hexadecimal: ival = 0xf jval = 0x400
            printed in decimal: ival = 15 jval = 1024

            noshowbase 操縱符重置 cout,以便它不再顯示整型值的表示基數(shù)。

            默認(rèn)情況下,十六進(jìn)制值用帶小寫 x 的小寫形式打印。可以應(yīng)用 uppercase 操縱符顯示 X 并將十六進(jìn)制數(shù)字 a - f 顯示為大寫字母。

            cout << uppercase << showbase << hex
            << "printed in hexadecimal: ival = " << ival
            << " jval = " << jval << endl
            << nouppercase << endl;

            前面的程序產(chǎn)生下面的輸出:

            printed in hexadecimal: ival = 0XF jval = 0X400

            要恢復(fù)小寫,就應(yīng)用 nouppercase 操縱符。

            控制浮點(diǎn)值的格式

            對(duì)于浮點(diǎn)值的格式化,可以控制下面三個(gè)方面:

            • 精度:顯示多少位數(shù)字。

            • 記數(shù)法:用小數(shù)還是科學(xué)記法法顯示。

            • 對(duì)是整數(shù)的浮點(diǎn)值的小數(shù)點(diǎn)的處理。

            默認(rèn)情況下,使用六位數(shù)字的精度顯示浮點(diǎn)值。如果值沒有小數(shù)部分,則省略小數(shù)點(diǎn)。使用小數(shù)形式還是科學(xué)記數(shù)法顯示數(shù)值取決于被顯示的浮點(diǎn)數(shù)的值,標(biāo)準(zhǔn)庫(kù)選擇增強(qiáng)數(shù)值可讀性的格式,非常大和非常小的值使用科學(xué)記數(shù)法顯示,其他值使用小數(shù)形式。

            指定顯示精度

            默認(rèn)情況下,精度控制顯示的數(shù)字總位數(shù)。顯示的時(shí)候,將浮點(diǎn)值四舍五入到當(dāng)前精度。因此,如果當(dāng)前精度是 4,則 3.14159 成為 3.142;如果精度是 3,打印為 3.14

            通過名為 precision 的成員函數(shù),或者通過使用 setprecision 操縱符,可以改變精度。precision 成員是重載的(第 7.8 節(jié)):一個(gè)版本接受一個(gè) int 值并將精度設(shè)置為那個(gè)新值,它返回先前的精度值;另一個(gè)版本不接受實(shí)參并返回當(dāng)前精度值。setprecision 操縱符接受一個(gè)實(shí)參,用來設(shè)置精度。

            下面的程序說明控制顯示浮點(diǎn)值所用精度的不同方法:

            // cout.precision reports current precision value
            cout << "Precision: " << cout.precision()
            << ", Value: " << sqrt(2.0) << endl;
            // cout.precision(12) asks that 12 digits of precision to be printed
            cout.precision(12);
            cout << "Precision: " << cout.precision()
            << ", Value: " << sqrt(2.0) << endl;
            // alternative way to set precision using setprecision manipulator
            cout << setprecision(3);
            cout << "Precision: " << cout.precision()
            << ", Value: " << sqrt(2.0) << endl;

            編譯并執(zhí)行后,程序產(chǎn)生下面的輸出:

            Precision: 6, Value: 1.41421
            Precision: 12, Value: 1.41421356237
            Precision: 3, Value: 1.41

            這個(gè)程序調(diào)用標(biāo)準(zhǔn)庫(kù)中的 sqrt 函數(shù),可以在頭文件 cmath 中找到它。sqrt 函數(shù)量重載的,可以用 floatdoublelong double 實(shí)參調(diào)用,它返回實(shí)參的平方根。


            操縱符和其他接受實(shí)參的操縱符定義在頭文件 iomanip 中。

            控制記數(shù)法

            默認(rèn)情況下,用于顯示浮點(diǎn)值的記數(shù)法取決于數(shù)的大小:如果數(shù)很大或很小,將按科學(xué)記數(shù)法顯示,否則,使用固定位數(shù)的小數(shù)。標(biāo)準(zhǔn)庫(kù)選擇使得數(shù)容易閱讀的記數(shù)法。


            將浮點(diǎn)數(shù)顯示為普通數(shù)(相對(duì)于顯示貨幣、百分比,那時(shí)我們希望控制值的外觀)的時(shí)候,通常最好讓標(biāo)準(zhǔn)庫(kù)來選擇使用的記數(shù)法。要強(qiáng)制科學(xué)記數(shù)法或固定位數(shù)小數(shù)的一種情況是在顯示表的時(shí)候,表中的小數(shù)點(diǎn)應(yīng)該對(duì)齊。

            如果希望強(qiáng)制科學(xué)記數(shù)法或固定位數(shù)小數(shù)表示,可以通過使用適當(dāng)?shù)牟倏v符做到這一點(diǎn):scientific 操縱符將流變?yōu)槭褂每茖W(xué)記數(shù)法。像在十六進(jìn)制值上顯示 x 一樣,也可以通過 uppercase 操縱符控制科學(xué)記數(shù)法中的 efixed 操縱符將流為使用固定位數(shù)小數(shù)表示。

            這些操縱符改變流精度的默認(rèn)含義。執(zhí)行 scientificfixed 之后,精度值控制小數(shù)點(diǎn)之后的數(shù)位。默認(rèn)情況下,精度指定數(shù)字的總位數(shù)——小數(shù)點(diǎn)之前和之后。使用 fixedscientific 命名我們能夠按列對(duì)齊來顯示數(shù),這一策略保證小數(shù)點(diǎn)總是在相對(duì)于被顯示的小數(shù)部分固定的位置。

            恢復(fù)浮點(diǎn)值的默認(rèn)記數(shù)法

            與其他操縱符不同,不存在將流恢復(fù)為根據(jù)被顯示值選擇記數(shù)法的默認(rèn)狀態(tài)的操縱符,相反,我們必須調(diào)用 unsetf 成員來取消 scientificfixed 所做的改變。要將流恢復(fù)為浮點(diǎn)值的默認(rèn)處理,將名為 floatfield 的標(biāo)準(zhǔn)庫(kù)定義值傳給 unsetf 函數(shù):

            // reset to default handling for notation
            cout.unsetf(ostream::floatfield);

            除了取消它們的效果之外,使用這些操縱符像使用任意其他操縱符一樣:

            cout << sqrt(2.0) << '\n' << endl;
            cout << "scientific: " << scientific << sqrt(2.0) << '\n'
            << "fixed decimal: " << fixed << sqrt(2.0) << "\n\n";
            cout << uppercase
            << "scientific: " << scientific << sqrt(2.0) << '\n'
            << "fixed decimal: " << fixed << sqrt(2.0) << endl
            << nouppercase;
            // reset to default handling for notation
            cout.unsetf(ostream::floatfield);
            cout << '\n' << sqrt(2.0) << endl;

            產(chǎn)生如下輸出:

            1.41421

            scientific: 1.414214e+00
            fixed decimal: 1.414214

            scientific: 1.414214E+00
            fixed decimal: 1.414214

            1.41421
            顯示小數(shù)點(diǎn)

            默認(rèn)情況下,當(dāng)浮點(diǎn)值的小數(shù)部分為 0 的時(shí)候,不顯示小數(shù)點(diǎn)。showpoint 操縱符強(qiáng)制顯示小數(shù)點(diǎn):

            cout << 10.0 << endl;        // prints 10
            cout << showpoint << 10.0 // prints 10.0000
            << noshowpoint << endl; // revert to default handling of decimal point

            noshowpoint 操縱符恢復(fù)默認(rèn)行為。下一個(gè)輸出表達(dá)式將具有默認(rèn)行為,即,如果浮點(diǎn)值小數(shù)部分為 0,就取消小數(shù)點(diǎn)。

            填充輸出

            按欄顯示數(shù)據(jù)的時(shí)候,經(jīng)常很希望很好地控制數(shù)據(jù)的格式化。標(biāo)準(zhǔn)庫(kù)提供下面幾個(gè)操縱幫助我們實(shí)現(xiàn)需要的控制:

            • setw,指定下一個(gè)數(shù)值或字符串的最小間隔。

            • left,左對(duì)齊輸出。

              right,右對(duì)齊輸出。輸出默認(rèn)為右對(duì)齊。

            • internal,控制負(fù)值的符號(hào)位置。internal 左對(duì)齊符號(hào)且右對(duì)齊值,用空格填充介于其間的空間。

            • setfill,使我們能夠指定填充輸出時(shí)使用的另一個(gè)字符。默認(rèn)情況下,值是空格。


            endl 一樣,setw 不改變輸出流的內(nèi)部狀態(tài),它只決定下一個(gè)輸出的長(zhǎng)度。

            下面程序段說明了這些操縱符:

            int i = -16;
            double d = 3.14159;
            // pad first column to use minimum of 12 positions in the output
            cout << "i: " << setw(12) << i << "next col" << '\n'
            << "d: " << setw(12) << d << "next col" << '\n';
            // pad first column and left-justify all columns
            cout << left
            << "i: " << setw(12) << i << "next col" << '\n'
            << "d: " << setw(12) << d << "next col" << '\n'
            << right; // restore normal justification
            // pad first column and right-justify all columns
            cout << right
            << "i: " << setw(12) << i << "next col" << '\n'
            << "d: " << setw(12) << d << "next col" << '\n';
            // pad first column but put the padding internal to the field
            cout << internal
            << "i: " << setw(12) << i << "next col" << '\n'
            << "d: " << setw(12) << d << "next col" << '\n';
            // pad first column, using # as the pad character
            cout << setfill('#')
            << "i: " << setw(12) << i << "next col" << '\n'
            << "d: " << setw(12) << d << "next col" << '\n'
            << setfill(' '); // restore normal pad character

            執(zhí)行時(shí),該程序段產(chǎn)生如下輸出:

            i:          -16next col
            d: 3.14159next col
            i: -16 next col
            d: 3.14159 next col
            i: -16next col
            d: 3.14159next col
            i: - 16next col
            d: 3.14159next col
            i: -#########16next col
            d: #####3.14159next col

            A.3.4. 控制輸入格式化

            默認(rèn)情況下,輸入操作符忽略空白(空格、制表符、換行符、進(jìn)紙和回車)。對(duì)下面的循環(huán):

            while (cin >> ch)
            cout << ch;

            給定輸入序列

            a b   c
            d

            循環(huán)執(zhí)行四次從字符 a 讀到 d,跳過介于其間的空格、可能的制表符和換行符。該程序段的輸出是:

            abcd

            noskipws 操縱符導(dǎo)致輸入操作符讀(而不是跳過)空白。要返回默認(rèn)行為,應(yīng)用 skipws 操縱符:

            cin >> noskipws;      // set cin so that it reads whitespace
            while (cin >> ch)
            cout << ch;
            cin >> skipws; // reset cin to default state so that it discards whitespace

            給定與前面相同的輸入,該循環(huán)進(jìn)行 7 次迭代,讀輸入中的空白以及字符。該循環(huán)產(chǎn)生如下輸出:

            a b    c
            d

            A.3.5. 未格式化的輸入/輸出操作

            迄今為止,示例程序中只使用過格式化的 IO 操作。輸入和輸出操作符(<<>>)根據(jù)被處理數(shù)據(jù)的類型格式化所讀寫的數(shù)據(jù)。輸入操作符忽略空白,輸出操作符應(yīng)用填充、精度等。

            標(biāo)準(zhǔn)庫(kù)還提供了豐富的支持未格式化 IO 的低級(jí)操作,這些操作使我們能夠?qū)⒘髯鳛槲唇忉尩淖止?jié)序列處理,而不是作為數(shù)據(jù)類型(如 charintstring 等)的序列處理。

            posted on 2009-05-27 17:53 pear_li 閱讀(1313) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

            一本一道久久综合狠狠老 | 久久99国产精品一区二区| 久久99精品久久久久久水蜜桃| 久久久久久毛片免费播放| 久久亚洲精品无码AV红樱桃| 久久久久无码精品国产不卡| 精品久久人妻av中文字幕| 久久久精品国产亚洲成人满18免费网站 | 久久精品国产亚洲Aⅴ香蕉| 国产亚洲综合久久系列| 国产精品美女久久久久AV福利| 国内精品久久久久久不卡影院| 亚洲国产日韩综合久久精品| 亚洲女久久久噜噜噜熟女| 久久精品综合一区二区三区| 中文精品久久久久人妻不卡| 青青热久久综合网伊人| 久久亚洲中文字幕精品一区四| 亚洲AV乱码久久精品蜜桃| 久久狠狠一本精品综合网| 久久综合久久综合亚洲| 久久w5ww成w人免费| 久久久久国产精品麻豆AR影院| 久久久久亚洲AV无码专区体验| 性高朝久久久久久久久久| 久久精品视频网| 99久久国产亚洲高清观看2024| 九九久久99综合一区二区| Xx性欧美肥妇精品久久久久久| 欧美牲交A欧牲交aⅴ久久| 狠狠色婷婷久久一区二区 | 国产叼嘿久久精品久久| 国产精品国色综合久久| 国产一区二区精品久久凹凸| 久久精品人妻中文系列| 亚洲欧洲中文日韩久久AV乱码| 欧美色综合久久久久久| 99久久国产宗和精品1上映| 久久久久夜夜夜精品国产| 国产一区二区精品久久岳| 亚洲AV日韩AV天堂久久|