关于C++中的格式化输入输出(详解版)

标准库定义了一组操作符来改变流的格式状态,包括控制数值的输入与输出形式以及控制补白的数量和位置,大多数改变格式状态的操作符是设置/复原成对的,当操作符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。

控制布尔值的格式

默认情况下bool值打印为1或0,我们可以使用boolalpha操作符使之输出true或false,使用noboolapha可以取消这种格式状态。对于输入流也同样生效,只有输入true才能使值变为true,输入1不行。

#include <iostream>
#include <ios>
#include <iomanip> //for setprecision
using namespace std;
int main()
{
    // float number = 123.456789;
    // cout<<fixed<<showpoint;//use decimal form,print decimal points
    // cout<<"Number is"<<setprecision(3)<<number<<endl;
    // cout<<"Number is"<<setprecision(4)<<number<<endl;
    cout << true << endl;
    cout << false << endl;

    cout << boolalpha;
    cout << true << endl;
    cout << false << endl;

    cout << noboolalpha;
    cout << true << endl;
    cout << false << endl;

    bool value = true;
    cin >> boolalpha >> value;//只有输入true/false时,value才能从流中提取值,要是没有输入true/false,则value的值默认为false,又因为cout没有使用boolalpha,所以会输出0/1
    cout << value << endl;

    system("pause");
    return 0;
}

控制浮点数格式

默认情况下,浮点数按六位数字精度打印,如果浮点数没有小数部分则不打印小数点,根据浮点数的值选择打印成定点十进制或科学记数法形式,标准库会选择一种可读性更好的格式:非常大和非常小的值打印为科学记数形式,其它值打印为定点十进制形式。

默认情况下,精度控制打印的数字的总数,浮点值按当前精度舍入而非截断,使用precision可以获取当前流的浮点数精度值以及设置流的浮点数精度值。

#include <iostream>
#include <iomanip>  //for setprecision
using namespace std;
int main(){
    float number = 123.456789;
    cout<<fixed<<showpoint;//use decimal form,print decimal points
    cout<<"Number is"<<setprecision(3)<<number<<endl;
    cout<<"Number is"<<setprecision(4)<<number<<endl;
    system("pause");
    return 0;
}

下图为控制台输出的结果
图片说明

指定整型值的进制

默认情况下,整型值的输入输出使用十进制,我们可以使用操作符hex、oct、和dec将其改为十六进制,八进制,十进制。

#include <iostream>
using namespace std;
int main()
{
    cout << hex << 111 << endl;//6f
    cout << oct << 111 << endl;//157
    cout << dec << 111 << endl;//111
    system("pause");
}

输入十六进制后输出十进制。

int main()
{
    int value = 100;
    cin >> hex >> value;
    cout << dec << value << endl;
    system("pause");
}

使用showbase可以显示进制,uppercase可以控制十六进制的x是否大写。

int main()
{
    cout <<uppercase<< showbase;//在输出结果中显式进制,0x表示十六进制,0表示八进制
    cout << hex << 111 << endl;//0X6f
    cout << nouppercase;
    cout << hex << 111 << endl;//0x6f
    cout << oct << 111 << endl;//0157
    cout << dec << 111 << endl;//111

    cout << noshowbase;
    cout << hex << 111 << endl;//6f
    cout << oct << 111 << endl;//157
    cout << dec << 111 << endl;//111
    system("pause");
}

控制输入格式

默认情况下,输入运算符会忽略空白符(空格符,制表符,换行符,换纸符和回车符),使用noskipws会令输入运算符读取空白符,而不是跳过他们。

int main(){
    char c;
    cin >> noskipws;
    while(cin >> c){
        cout << c;
    }
}

输出空白

setw可以指定下一个输出的最小空间,如果不满则用空格填充,类似endl,setw不改变输出流的内部状态,它只决定下一个输出的大小。

setw默认使用右对齐格式,使用left和right可以修改对齐格式为左对齐和右对齐,使用internal修改对齐格式为符号左对齐,值右对齐。使用setfill可允许指定一个字符代替默认的空格来补白输出。

int main()
{
    cout <<setw(16)<< -3.14156789 << endl;
    cout <<left<< setw(16) << -3.14156789 << endl;
    cout << right << setw(16) << -3.14156789 << endl;
    cout << internal << setw(16) << -3.14156789 << endl;
    cout << setfill('*') << endl;
    cout << left << setw(16) << -3.14156789 << endl;
    cout << right << setw(16) << -3.14156789 << endl;
    cout << internal << setw(16) << -3.14156789 << endl;
    system("pause");
}
        -3.14157
-3.14157
        -3.14157
-        3.14157

-3.14157********
********-3.14157
-********3.14157

提供两张表,来查看c++输入输出的格式操作符。

图片说明

图片说明

全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务