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

    xiaoxiao2024-09-27  88

    本节书摘来自异步社区出版社《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 格式化标志

    一些格式化选项可以具有一定范围的值。例如,用来确定显示整型数基数的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 格式化域

    程序清单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

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

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)