《C和C++代码精粹》——1.9 格式化

简介:

本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第1章,第1.9节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.9 格式化

C和C++代码精粹
在程序清单1.8中ios::skipws是一个格式化标志的例子。格式化标志是位掩码值,该位掩码值可以通过成员函数setf来设置,也可用unsetf复位(见表1.1的完整描述)。

程序清单1.9的程序阐述了数字的格式化。标准流成员函数precision用来指定浮点值显示的小数位数。如果没有设置ios::showpoint标志,那么末尾的零不被显示。要用前置加号来打印正数,就用ios::showpos。在上例中想要以16进制形式显示x 和在指数形式中显示大写e,使用ios::uppercase。

程序清单1.7 计算文本文件中的字数

// wc.cpp:显示字的个数  
#include <iostream>  
using namespace std;  

main()  
{  
    const size_t BUFSIZ = 128;  
    char s[BUFSIZ];  
    size_t wc = 0;  

    while (cin >> s)  
        ++wc;  
    cout << wc << '\n';  
}  

//从"wc < wc.cpp”命令输出  
34

程序清单1.8 与程序copy1.cpp完全相同,但使用提取运算符读取空格

// copy3.cpp :用>>读取空格符  
#include <iostream>
using namespace std;  

main()  
{  
    char c;  

    //不要跳过空格符  
    cin.unsetf(ios::skipws);  

    while (cin >> c)  
        cout << c;  
}

表1.1 格式化标志
image

一些格式化选项可以具有一定范围的值。例如,用来确定显示整型数基数的ios::basefield可以被设置成10进制、8进制或16进制。(见表1.2中3种格式化域有效的描述)由于这些是位域而不是单个的位,可用带两个参数形式的setf来设置。例如,程序清单1.10的程序设置8进制数模式采用下面语句:

cout.setf ( ios::oct,ios::basefield );
用标志ios::showbase进行设置时,8进制以0开头,16进制以0x开头打印输出(或者以0X开头打印输出,如果ios::uppercase也被设置)。

程序清单1.9 描述数据格式化

// float.cpp :格式化真正的数字  
#include <iostream>  
using namespace std;  

main()  
{  
    float x = 12345.6789, y = 12345;  
    cout << x << ' ' << y << '\n';  

    //显示两个十位数  
    cout.precision(2);  
    cout << x << ' ' << y << '\n';  

    //显示末尾的零  
    cout.setf(ios::showpoint);  
    cout << x << ' ' << y << '\n';  

    //显示符号  
    cout.setf(ios::showpos);  
    cout << x << ' ' << y << '\n';  

    //返回符号和默认值的精度  
    cout.unsetf(ios::showpos);  
    cout.precision(0);  

//使用科学计数法  
    cout.setf(ios::scientific,ios::floatfield);  
    float z = 1234567890.123456;  
    cout << z << '\n';  
    cout.setf(ios::uppercase);  
    cout << z << '\n';  
}  

//输出:  
12345.678711 12345  
12345.68 12345  
12345.68 12345.00  
+12345.68 +12345.00  
1.234568e+09  
1.234568E+09

表1.2 格式化域

image

程序清单1.10 显示整数的基数

// base1.cpp :显示整数的基数  
#include <iostream>  
using namespace std;  

main()  
{  
    int x, ![image](https://yqfile.alicdn.com/d4dff4359c675def6e527db1695916fa57198610.png)
y, z;  

    cout << "输入三个整数: ";    
    cin >> x >> y >> z;  
    cout << x << ',' << y << ',' << z << endl;  

    //在不同基数中打印  
    cout << x << ',';  
    cout.setf(ios::oct,ios::basefield);  
    cout << y << ',';  
    cout.setf(ios::hex,ios::basefield);  
    cout << z << endl;  

//显示基数前缀  
    cout.setf(ios::showbase);  
    cout << x << ',';  
    cout.setf(ios::oct,ios::basefield);  
    cout << y << ',';  
    cout.setf(ios::hex,ios::basefield);  
    cout << z << endl;  
}  

//运行结果  
输入三个整数:10 010 0x10  
10,8,16  
10,10,10  
0xa,010,0x10

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
1月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
48 2
|
30天前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
101 0
|
3月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
64 1
|
4月前
|
C++
C++代码的可读性与可维护性:技术探讨与实践
C++代码的可读性与可维护性:技术探讨与实践
93 1
|
1月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
47 2
|
1月前
|
C++
拥抱C++面向对象编程,解锁软件开发新境界!从混乱到有序,你的代码也能成为高效能战士!
【8月更文挑战第22天】C++凭借其强大的面向对象编程(OOP)能力,在构建复杂软件系统时不可或缺。OOP通过封装数据和操作这些数据的方法于对象中,提升了代码的模块化、重用性和可扩展性。非OOP方式(过程化编程)下,数据与处理逻辑分离,导致维护困难。而OOP将学生信息及其操作整合到`Student`类中,增强代码的可读性和可维护性。通过示例对比,可以看出OOP使C++代码结构更清晰,特别是在大型项目中,能有效提高开发效率和软件质量。
23 1
|
1月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
46 0
|
1月前
|
C++
Resharper c++ 使用Enter自动补全代码
Resharper c++ 使用Enter自动补全代码
32 0
|
1月前
|
监控 编译器 C++
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
36 0
|
2月前
|
前端开发 编译器 程序员
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决