以下内容摘自木缥缈的博客


使用cout进行格式化

  ostream插入运算符将值转换为文本格式。在默认情况下,格式化值的方式如下。

    *  对于char值,如果它代表的是可打印字符,则将被作为一个字符显示在宽度为一个字符的字段中。

    *  对于数值整型,将以十进制方式显示在一个刚好容纳该数字及负号(如果有的话)的字段中;

    *  字符串被显示在宽度等于该字符串长度的字段中。

  浮点数的默认行为有变化。下面详细说明了老式实现和新式实现之间的区别。

    *新式:浮点类型被显示为6位,末尾的0不显示(注意,显示的数字位数与数字被存储时精度设置没有任何关系)。数字以定点表示法显示还是科学计数法表示,取决于它的值。具体来说,当指数大于等于6或小于等于-5时,将使用科学计数法表示。另外,字段宽度恰好容纳数字和负号(如果有的话)。默认的行为对应于带%g说明符的标准C库函数fprintf()。

    *老式:浮点类型显示为带6位小数,末尾的0不显示(注意,显示的数字位数与数字被存储时的精度没有任何关系)。数字以定点表示法显示还是以科学计数法表示,取决于他的值。另外,字段宽度恰好容纳数字和负号(如果有的话)。

  因为每个值的显示宽度等于它的长度,因此必须显式地在值之间提供空格;否则,相邻的值将不会被分开。

  注意:并非所有的编译器都能生成符合当前C++标准格式的输出。另外,当前标准允许区域性变化。例如,欧洲实现可能遵循欧洲人的风格:使用逗号而不是句点来表示小数点。也就是说,2.54将被写成2,54 。区域库(头文件locale)提供了用特定的风格影响(imbuing)输入或输出流的机制,所以同一个编译器能够提供多个区域选项。本章使用美式格式。  

(1)修改显示时使用的计数系统

  ostream类是从ios类派生来的,而后者是从ios_base派生来的。ios_base类存储了描述格式状态的信息。例如,一个类成员中某些位决定了使用的计数系统,而另一个成员则决定了字段宽度。通过使用控制符(manipulator),可以控制显示整数时使用的技术系统。通过使用ios_base的成员函数,可以控制字段宽度和小数位数。由于ios_base类是ostream的间接基类,因此可以将其方法用于ostream对象(或子代),如cout。

  注意:ios_base类中的成员和方法以前位于ios中。现在,ios_base是ios的基类。在新系统中,ios是包含char和wchar_t具体化的模板,而ios_base包含了非模板特性。

  要控制整数以十进制、十六进制还是八进制显示,可以使用dec、hex和oct控制符。例如,下面的函数调用将cout对象的计数系统格式状态设置为十六进制:

    hex(cout);

    完成上述设置后,程序将以十六进制形式打印整数值,直到将格式状态设置为其他选项为止。注意,控制符不是成员函数,因此不必通过对象来调用。

  虽然控制符实际上是函数,但它们通常的使用方式为:

    cout << hex;

    ostream类重载了<<运算符,这使得上述用法与函数调用hex(cout)等价。控制符位于名称空间std中。下面的代码演示了控制符的使用方法(注意,可以单独使用控制符,也可以将其作为一系列插入的部分):

#include <iostream>

int main()
{ using namespace std;
cout << "输入一个数字:"; int n;
cin >> n;
std::string str(5,' ');
cout << "n" << str << "n*n\n";
cout << n << str << n*n << "(decimal)\n"; //设置成十六进制系统
cout << hex;
cout << n << str;
cout << n*n << " (hexadecimal)\n"; //设置为八进制系统
cout << oct << n << str << n * n << " (octal)\n"; dec(cout);
cout << n << str << n * n << " (decimal)\n"; return 0;
} 输出结果:
输入一个数字:12
n n*n
12 144 (decimal)
c 90 (hexadecimal)
14 220 (octal)
12 144 (decimal)

(2)调整字段宽度

  可以使用width成员函数将长度不同的数字放到宽度相同的字段中,该方法的原型为:

    int width();

    int width(int i);

  第一种格式返回字段宽度的当前设置;第二种格式将字段宽度设置为i个空格,并返回以前的字段宽度值。这使得能够保存以前的值,以便以后恢复宽度值时使用。

  width()方法之影响显示的下一个项目,然后字段宽度将恢复为默认值。由于width()是成员函数,因此必须使用对象来调用它。

  C++永远不会截短数据,因此如果试图在宽度为2的字段中打印一个7位值,C++将增宽字段,以容纳该数据。C/C++的原则是:显示所有的数据比保持列的整洁更重要;C++视内容重于形式。

 1 #include <iostream>
2
3 int main() 4 {
5 using namespace std; 6 size_t w = cout.width(30);
7 cout << "Default field width = " << w << ":\n";
8 cout.width(5);
9 cout << "N" << ':';
10 cout.width(8);
11 cout << "N * N" << ":\n";
12
13 for (long i = 1; i <= 100; i *= 10) {
14 cout.width(5);
15 cout << i << ':';
16 cout.width(8);
17 cout << i * i << ":\n";
18 }
19 return 0;
20 }
21
22 输出结果:
23 Default field width = 0:
24 N: N * N:
25 1: 1:
26 10: 100:
27 100: 10000:

  在上面的输出中,值在字段中右对齐。输出中包含空格,也就是说,cout通过加入空格来填满整个字段。右对齐时,空格被插入到值的左侧。用来填充的字符叫做填充字符(fill character)。右对齐是默认的。

(3)填充字符

  在默认情况下,cout使用空格填充字段中未被使用的部分,可以使用fill()成员函数来改变填充字符。例如,下面的函数调用将填充字符改为星号:

    cout.fill('*');

  这对于检查打印结果,防止接收方添加数字很有用。

#include <iostream>

int main()
{
using namespace std;
cout.fill('*');
const char * staff[2] = {"iPhone6s", "iPad2"};
long bonus[2] = {900,1350};
for (int i = 0; i < 2; i ++) {
cout.width(10);
cout << staff[i] << ": $";
cout.width(7);
cout << bonus[i] << "\n";
}
return 0;
} 输出结果:
**iPhone6s: $****900
*****iPad2: $***1350

(4)设置浮点数的显示精度

  浮点数精度的含义取决于输出模式。在默认情况下,它指的是显示的总位数。在定点模式和科学模式下,精度指的是小数点后面的位数。已经知道,C++的默认精度为6位(但末尾的0将不显示)。precision成员函数使得能够选择其他值。例如,下面的函数调用将cout的精度设置为2:

    cout.precision(2);

  和width()的情况不同,但与fill()相似,新的精度设置将一直有效,直到被重新设置。下面的程序说明了这一点:

#include <iostream>

int main()
{
using namespace std;
float price1 = 25.5;
float price2 = 1.9 + 8.0/9.0;
cout.width(10);
cout << "\"Apple\"" << ": $" << price1 << "\n";
cout.width(10);
cout << "\"Flower\"" << ": $" << price2 << "\n"; cout.precision(2);
cout.width(10);
cout << "\"Apple\"" << ": $" << price1 << "\n";
cout.width(10);
cout << "\"Flower\"" << ": $" << price2 << "\n"; return 0;
} 输出结果:
"Apple": $25.5
"Flower": $2.78889
"Apple": $26
"Flower": $2.8

注意,第3行没有打印小数点及其后面的内容。另外,第4行显示的总位数为2位。

(5)打印末尾的0和小数点

  对于有些输出,希望保留末尾的0,iostream系列类没有提供专门用于完成这项任务的函数,但ios_base类提供了一个setf()函数(用于set标记),能够控制多种格式化特性。这个类还定义了多个常量,可以作为函数的参数。例如,下面的函数调用使cout显示末尾的小数点:

    cout.setf(ios_base::showpoint);

  使用默认的浮点格式时,上述语句还将导致末尾的0被显示出来。

  showpoint是ios_base类声明中定义的类级静态常量。类级意味着如果在成员函数定义的外面使用它,则必须在常量名前加上作用域运算符(::)。因此,ios_base::showpoint指的是在ios_base类中定义的一个常量。

#include <iostream>

int main()
{
using namespace std;
float price1 = 25.5;
float price2 = 1.9 + 8.0/9.0;
cout.setf(ios_base::showpoint);
cout.width(10);
cout << "\"Apple\"" << ": $" << price1 << "\n";
cout.width(10);
cout << "\"Flower\"" << ": $" << price2 << "\n"; cout.precision(2); cout.width(10);
cout << "\"Apple\"" << ": $" << price1 << "\n";
cout.width(10);
cout << "\"Flower\"" << ": $" << price2 << "\n"; return 0;
} 输出结果:
"Apple": $25.5000
"Flower": $2.78889
"Apple": $26.
"Flower": $2.8

使用cout进行格式化的更多相关文章

  1. C++学习 cout的格式化输出

    cout的格式化输出 1.常用: ①double 输出到小数点后n位:(保留精度 n位) #include <iostream> #include <iomanip> usin ...

  2. C++输入输出流 cin/cout 及格式化输出简介

    C++ 可通过流的概念进行程序与外界环境( 用户.文件等 )之间的交互.流是一种将数据自源( source )推送至目的地( destination )的管道.在 C++ 中,与标准输入/输出相关的流 ...

  3. cout设置输出数据不显示科学计数法

    [解决方案] 1.在头文件包含—#include<iomanip>——定义IO流输出输入格式控制相关函数. 2.利用cout输出格式为—cout << fixed <&l ...

  4. Simple File System

    This is my operating system class design. scanner.h #include<string> using namespace std; #pra ...

  5. C++——输入、输出和文件

    一.C++输入和输出概述 1.1.流和缓冲区 C++程序把输入和输出看作字节流.输入时,程序从输入流中抽取字节:输出时,程序将字节插入到输出流中.对于面相文本的程序,每个字节代表一个字符,更通俗地说, ...

  6. c++语法集锦

    1.指针的引用 他也是引用,引用是特定内存块的别名 2.变量定义 更准确的说是内存使用约定,并为该约定命名 命名3.指向常变量的指针和常指针 有点拗口,都是指针,但对于所在内存块的使用约定不同.常变量 ...

  7. 字符串流sstream[part1/基本知识]

    C++中的输入输出分为三种:基于控制台的I/O,即istream.ostream.iostream:基于文件的I/O,即ifstream.ofstream.fstream:基于字符串的I/O,即ist ...

  8. C++ Primer Plus (Stephen Prata 著)

    第1章 预备知识 (已看) 第2章 开始学习C++ (已看) 第3章 处理数据 (已看) 第4章 复合类型 (已看) 第5章 循环和关系表达式 (已看) 第6章 分支语句和逻辑运算符 (已看) 第7章 ...

  9. log4cpp第一个程序HelloWord

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

随机推荐

  1. 关于linux‘RedHat6.9在VMware虚拟机中的安装步骤

    redhat支持多种安装方式:光盘安装,硬盘安装和网络安装等,可以根据个人的实际情况来选择.我在这里选择的是光盘安装的方式安装RHEL6.9.(以下简称6.9) 1.首先准备好6.9的光盘镜像,在安装 ...

  2. js如何生成id随机数

    有时候在我们在新增数据时,需要自动生成主键id等,就经常会遇到需要生成随机数的方法. 下面先介绍一种比较简单的生成随机数方法: //产生随机数函数 function RndNum(n){ var rn ...

  3. TinyMCE:下载、安装、配置

    第一步:下载 官网下载:https://www.tiny.cloud/download/ TinyMCE从4.0开始,不再支持直接下载,而是直接使用提供免费的CDN,让用户免除安装过程,可以在网站中使 ...

  4. day2-exercise

    # Author: 刘佳赐-Isabelle October 22,2018 """ 1.有变量name = "aleX leNb" 完成如下操作: ...

  5. for循环删除列表中元素遇到的漏删的问题(python)

    问题描述:python中通过for循环来删除列表中的两个相邻的元素,存在漏删的问题 比如说下面的例子,准备删掉2和3,但是结果是2删掉了,3没删掉 是因为把2删掉后3的下标就变成了1,但是原本下标为1 ...

  6. linux线程篇 (一) 线程的基本概念

    --进程 一个正在执行的程序,资源分配的最小单位 进程中的事情需要按照一定顺序区执行的,但是如何在一个进程中让一些事情同时发生呢?子进程存在缺陷 --引进多线程 --线程:有时又称轻量级进程,程序执行 ...

  7. jxls-1.x导出excel入门——基本操作

    请注意,一下内容均基于1.x版本,2.x版本将另开随笔记录 一.概述  JXLS是基于Jakarta POI API的Excel报表生成工具,可以生成精美的Excel格式报表.它采用标签的方式,类似J ...

  8. MySQL入门第三天(上)——函数与视图

    一.MySQL函数 同样的,完整的函数可以参照开源中国的手册:http://tool.oschina.net/apidocs/apidoc?api=mysql-5.1-zh 1.字符函数 CONCAT ...

  9. 4946: [Noi2017]蔬菜

    4946: [Noi2017]蔬菜 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 分析: 贪心. 首先可以将一个蔬菜拆成两个,一个是有加成 ...

  10. VINS(九)Ceres Solver优化(未完待续)

    使用Ceres Solver库处理后端优化问题,首先系统的优化函数为