从零开始学C++之IO流类库(四):输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)

一、以操纵子方式格式化

数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符。把它们作为插入操作符<<的输出对象即可。如setiosflags、setw、setfill、setprecision、hex、oct等。

(一)、常用的流操纵算子:

(二)、ios类的枚举常量

#include <iostream>
#include <iomanip>

using namespace std;

// 通过操纵子方式进行格式化输出
// 宽度控制
// 对齐控制
// 填充控制
// 精度控制
// 进制输出
int main(void)
{
    //system("chcp 936");
    int n = 64;
    double d = 123.45;
    double d2 = 0.0187;

    cout << "=================宽度控制=====================" << endl;
    cout << n << '#' << endl;
    cout << setw(10) << n << '#' << n << endl;      // 宽度控制不会影响下一个输出

    cout << "=================对齐控制=====================" << endl;
    cout << setw(10) << setiosflags(ios::left) << n << '#' << endl;
    cout << setw(10) << n << '#' << endl;           // 对齐控制会影响下一个输出
    //cout<<setw(10)<<setiosflags(ios::right)<<n<<'#'<<endl;
    cout << setw(10) << resetiosflags(ios::left) << n << '#' << endl; //去除左对齐

    cout << "=================填充控制=====================" << endl;
    cout << setw(10) << setfill('?') << n << '#' << endl;
    cout << setw(10) << n << '#' << endl;           // 填充控制会影响下一个输出
    cout << setw(10) << setfill(' ') << n << '#' << endl;

    cout << "=================精度控制=====================" << endl;
    cout << setprecision(4) << d << endl; //有效数字
    cout << setprecision(2) << d2 << endl;

    cout << setiosflags(ios::fixed);
    cout << setprecision(4) << d << endl; // 小数点后面位数
    cout << setprecision(2) << d2 << endl;

    cout << "=================进制输出=====================" << endl;

    cout << n << endl;
    cout << oct << n << endl;
    cout << hex << n << endl;
    cout << endl;

    cout << setiosflags(ios::showbase); //八进制加前缀0,十六进制加前缀0x
    cout << dec << n << endl;
    cout << oct << n << endl;
    cout << hex << n << endl;

    cout << endl;
    cout << setbase(10) << n << endl; //八进制加前缀0,十六进制加前缀0x
    cout << setbase(8) << n << endl;
    cout << setbase(16) << n << endl;

    return 0;
}

二、以类成员函数方式格式化

通过调用流的成员函数控制格式,如setf、unsetf、width、fill、precision等。优点是在设置格式同时,可以返回以前的设置,便于恢复原来的设置。

ios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作:

#include <iostream>
//#include <iomanip>

using namespace std;

// 通过成员函数方式进行格式化输出
// 宽度控制
// 对齐控制
// 填充控制
// 精度控制
// 进制输出
int main(void)
{
    //system("chcp 936");
    int n = 64;
    double d = 123.45;
    double d2 = 0.0187;

    cout << "=================宽度控制=====================" << endl;
    cout << n << '#' << endl;
    cout.width(10);
    cout << n << '#' << n << endl;                  // 宽度控制不会影响下一个输出

    cout << "=================对齐控制=====================" << endl;
    cout.width(10);
    cout.setf(ios::left);
    cout << n << '#' << endl;
    cout.width(10);
    cout << n << '#' << endl;               // 对齐控制会影响下一个输出
    //cout.width(10);
    //cout.setf(ios::right);
    //cout<<n<<'#'<<endl;

    cout.width(10);
    cout.unsetf(ios::left);
    cout << n << '#' << endl;

    cout << "=================填充控制=====================" << endl;
    cout.width(10);
    cout.fill('?');
    cout << n << '#' << endl;

    cout.width(10);
    cout << n << '#' << endl;               // 填充控制会影响下一个输出

    cout.width(10);
    cout.fill(' ');
    cout << n << '#' << endl;

    cout << "=================精度控制=====================" << endl;
    cout.precision(4);
    cout << d << endl;
    cout.precision(2);
    cout << d2 << endl;

    cout.setf(ios::fixed);
    cout.precision(4);
    cout << d << endl;
    cout.precision(2);
    cout << d2 << endl;;

    cout << "=================进制输出=====================" << endl;

    cout.setf(ios::showbase);
    cout << n << endl;
    cout.unsetf(ios::dec);
    cout.setf(ios::oct);
    cout << n << endl;

    cout.unsetf(ios::oct);
    cout.setf(ios::hex);
    cout << n << endl;

    return 0;
}

参考:

C++ primer 第四版 Effective C++ 3rd C++编程规范

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nummy

python中json对象转换出错解决方法【转】

今天在使用python中的json转换碰到一个问题: 接收一个post的json字符串:

10540
来自专栏Golang语言社区

Go-指针、传值与传引用、垃圾回收

要点 Go使用的*、&、new()这些运算符,和C++的用法完全一样。 有传值和传引用/传地址的概念,和C++一样。 Go没有new对应的delete操作,而是...

376100
来自专栏GreenLeaves

Jquery 触发器之treigger()方法简介

trigger是个很神奇的东西,它可以模拟简单的用户输入操作。并触发点击click, mouseover, keydown 等事件. 具体使用方法如下: $("...

19990
来自专栏北京马哥教育

Python爬虫库-BeautifulSoup的使用

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标...

10800
来自专栏前端知识分享

第22天:js改变样式效果

1、alert:弹出警示框(用的非常少,用户体验不好) 完整写法:window.alert(“执行语句”); window对象,窗口,一般情况可省略 alert...

14410
来自专栏我和PYTHON有个约会

爬虫0040:数据筛选爬虫处理之结构化数据操作

爬虫程序,主要是运行在网络中进行数据采集的一种计算机程序,正常的一个爬虫采集数据的过程大致如下:

24710
来自专栏C/C++基础

web前端开发初学者十问集锦(5)

(1)立即执行函数的定义 立即执行函数(Immediately Invoked Function)是在页面加载时立即被执行的函数。

10020
来自专栏xingoo, 一个梦想做发明家的程序员

【AngularJS】—— 12 独立作用域

前面通过视频学习了解了指令的概念,这里学习一下指令中的作用域的相关内容。 通过独立作用域的不同绑定,可以实现更具适应性的自定义标签。借由不同的绑定规则绑定属...

20780
来自专栏Golang语言社区

Go-指针、传值与传引用、垃圾回收

要点 Go使用的*、&、new()这些运算符,和C++的用法完全一样。 有传值和传引用/传地址的概念,和C++一样。 Go没有new对应的delete操作,而是...

35350
来自专栏WindCoder

mybatis在xml文件中处理大于号小于号的方法(mybatis大于小于的转义)

SELECT * FROM test WHERE 1 = 1 AND start_date  &lt;= CURRENT_DATE AND end_date &...

14910

扫码关注云+社区

领取腾讯云代金券