参考:http://www.weixueyuan.net/view/6409.html

总结:

  我们需要借助格式标识符来控制cout对象的输出格式。

  在ios_base类中,系统已经定义了很多格式标识符,通过这些标识符,我们可以很好地进行格式化控制,具体见下表。ios_base类中还定义有width和precision等函数。

  除了能够直接调用这些格式标识符之外,我们可以借助类中提供的成员函数。

  这些函数都是ios_base类的成员函数,可以通过对象直接调用,而cout是basic_ostream的一个对象,basic_ostream继承自ios_base,因此cout可以调用这些函数。

  ios_base::showbase,即显示基数,基数的意思就是说在十六进制前加上0x,在八进制前加上0,十进制则不作处理。

  一旦格式设置完成,则会一直保持格式,除非取消格式,因此在设置新格式前最好将原有设置的格式都取消。

  这些格式化控制除了可以使用格式标识来控制外,我们还可以使用操纵器来控制。

  操作器其本质是函数,它可以直接改变流的格式。  

  C++标准库中预定义了一些操纵器,使用其中带参数的操纵器则需要包含头文件iomanip,下标中列出了一些带参数的操纵器。

----------------------------------

在我们设计程序时,我们通常需要将输出数据以某种格式显示出来,例如我们希望将时间显示为“dd:dd:dd”的形式,如此一来我们就需要借助格式标识符来控制cout对象的输出格式。在ios_base类中,系统已经定义了很多格式标识符,通过这些标识符,我们可以很好地进行格式化控制,具体见下表。除此之外,ios_base类中还定义有width和precision等函数,这些函数同样可以辅助我们进行格式化控制。

格式标识符 用途
boolalpha 以true和false的形式读写bool类型变量
dec 以十进制的方式进行读写
oct 以八进制的方式进行读写
hex 以十六进制的方式进行读写
internal 放在正负号或基数标识之后
left 左对齐
right 右对齐
fixed 以定点方式表示浮点数
scientific 用科学计数法表示浮点数
showbase 输出时显示基数
showpoint 必须显示小数点
showpos 对非负数显示+号
skipws 忽略空格
unitbuf 写操作完成后清扫所有的缓冲区
uppercase 用大写字母表示十六进制
adjustfield 格式标识必须是left、right或internal
basefield 格式标识必须是dec、oct或hex
floatfield 格式标识必须是scientific或fixed

有了表中所列标识符我们确实可以进行格式控制,但是除了能够直接调用这些格式标识符之外,我们可以借助类中提供的成员函数,具体成员函数见下表。

成员函数 用途
flags() 返回当前的格式标识
flags( val ) 将格式标识设置为val,并返回旧值
setf ( val ) 将val设置为当前的格式标识,并返回旧的格式标识
setf ( val, ios_base::basefield ) 将val设置为当前的格式标识,并返回旧的格式标识,且要求val为iso_base::dec、ios_base::hex或ios_base::oct三者之一
setf ( val, ios_base::adjustfield ) 将val设置为当前的格式标识,并返回旧的格式标识,且要求val为iso_base::left、ios_base::internal或ios_base::right三者之一
setf ( ios_base::internal, ios_base::adjustfield ) 在符号与数据之间填充字符,并返回旧标识
setf ( ios_base::scientific,
ios_base::floatfield )
设置科学计数法并返回旧标识
setf ( ios_base::fixed,
ios_base::floatfield )
设置定点计数法并返回旧标识
setf ( 0, ios_base::floatfield ) 设置默认浮点数表示法并返回旧标识
unsetf ( val ) 清楚指定的标识并返回旧标识

这些函数都是ios_base类的成员函数,可以通过对象直接调用,而cout是basic_ostream的一个对象,basic_ostream继承自ios_base,因此cout可以调用这些函数。

例1:

#include<iostream>
using namespace std; int main()
{
ios_base::fmtflags old_val = cout.flags( ios_base::left | ios_base::hex |ios_base::uppercase | ios_base::showbase ); for( int i = ; i < ; i ++ )
cout << i << endl;
cout<<endl<<endl;
cout.unsetf ( ios_base::left | ios_base::hex |ios_base::uppercase ); cout.setf ( old_val );
for( int i = ; i < ; i ++ )
cout << i << endl;
cout<<endl<<endl;
cout.unsetf( old_val ); cout.setf ( ios_base::hex | ios_base::uppercase );
cout << " hex " << << endl;
cout.unsetf( ios_base::hex | ios_base::uppercase );
cout.setf ( ios_base::oct );
cout << " oct " << << endl;
cout.unsetf( ios_base::oct );
cout.setf ( ios_base::dec );
cout << " dec " << << endl; return ;
}

本例中我们先调用flags函数设置输出格式,格式设置为左对齐和大写的十六进制,之后我们将100~149的数字全部输出,输出完之后我们将刚才设置的格式全部取消,然后重新设置为原始的格式old_val,再将数字100~149的数字重新输出一遍。之后我们演示的是将170按照十六进制、八进制和十进制的形式输出。

在整个程序中由于我们一开始设置了ios_base::showbase,即显示基数,基数的意思就是说在十六进制前加上0x,在八进制前加上0,十进制则不作处理。我们一开始设置了ios_base::showbase后,一直没有取消设置,因此在整个程序输出过程中一直都是加上了基数。出现这种情况也是我们要注意的,一旦格式设置完成,则会一直保持格式,除非取消格式,因此在设置新格式前最好将原有设置的格式都取消。

例2:

#include<iostream>
using namespace std; int main()
{
cout.width ( );
cout << - << endl; cout.setf( ios_base::left ,ios_base::adjustfield);
cout.width ( );
cout << - << endl;
cout.unsetf( ios_base::left ); cout.setf( ios_base::right ,ios_base::adjustfield);
cout.width ( );
cout << - << endl;
cout.unsetf( ios_base::right ); return ;
}

  

在本例中我们调用成员函数width控制输出的宽度为6个字符的位置,之后我们分别设置左对齐和右对齐,然后输出-100。从上面程序中我们可以看出默认是采用右对齐的方式输出的。

当然,这些格式化控制除了可以使用格式标识来控制外,我们还可以使用操纵器来控制,下面我们来简单了解一下操纵器。操作器其本质是函数,它可以直接改变流的格式。

例3: 

cout << hex << uppercase << " hex " <<  << endl;
cout << oct << " oct " << << endl;
cout << dec << " dec " << << endl;

 

本例中hex、oct、dec和uppercase都是操纵器,它可以与输入或输出操作符一起使用。

C++标准库中预定义了一些操纵器,使用其中带参数的操纵器则需要包含头文件iomanip,下标中列出了一些带参数的操纵器。

格式标识符 作用对象 功能
setbase( int n ) basic_ostream 将n设置为基数(默认值为0)
setfill( char_type c ) basic_ostream 设置填充字符为c
setprecision( int n ) basic_ostream 设置精度为n
setw( int n ) basic_ostream 设置域宽为n
setiosflags( val ) ios_base 设置指定的标识
resetiosflags( val ) ios_base 清除指定的标识

表中列出的最后两个函数,其参数值为标识,即为格式标识符的组合。

8.3 C++格式标识和操纵器的更多相关文章

  1. Kafka的消息格式

    Commit Log Kafka储存消息的文件被它叫做log,按照Kafka文档的说法是: Each partition is an ordered, immutable sequence of me ...

  2. Oracle Standard Error 列表

    今天,我特意从网上找了一些,以及自己平时总结的,关于错误编号和说明,平时我们在写项目的时候,往往是可能会出现下面这些错误,例如:违反唯一约束,无效的会话ID,等等.希望对大家有点帮助!可以看看,如果有 ...

  3. SQL Server 多实例下的复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 搭建步骤(Procedure) 注意事项(Attention) 二.背景(Contexts) ...

  4. ORA 各种oraclesql错误

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...

  5. C#定义类型转化 及 格式化字符串

    operator 关键字 operator 关键字用来重载内置运算符,或提供类/结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转化时可采用 ...

  6. oracle 错误代码大全

    oracle错误代码大全(超详细)   ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最 ...

  7. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  8. SQL错误码

    ///////////////////////////////////////////////////////////////ORA-00001: 违反唯一约束条件 (.)ORA-00017: 请求会 ...

  9. Oracle 存储过程异常处理

    Oracle 存储过程异常处理 1.异常的优点    如果没有异常,在程序中,应当检查每个命令的成功还是失败,如  BEGIN  SELECT ...  -- check for ’no data f ...

随机推荐

  1. JS获取当前日期方法

    Date.prototype.format = function (format) { var args = { "M+": this.getMonth() + 1, " ...

  2. [jQuery] 通过ajax保存到服务器,成功显示信息.

    保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: "some.php", data: " ...

  3. ubuntu无法关机,卡死

    (1)第一种方法(可行,但开关机出现命令行代码) $ sudo vim /etc/default/grub 将GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ...

  4. 雷林鹏分享:jQuery EasyUI 窗口 - 自定义窗口工具栏

    jQuery EasyUI 窗口 - 自定义窗口工具栏 默认情况下,窗口(window)有四个工具:collapsible.minimizable.maximizable 和 closable.比如我 ...

  5. tomcat ----> 启动,关闭和配置等等

    1.启动 在tomcat安装目录的bin文件中双击startup.bat. 2.关闭 在tomcat安装目录的bin文件中双击shutdown.bat. 3.配置tomcat-user.xml文件 ( ...

  6. Aria2 研究(研究资料来自互联网)

    # AriaNg https://github.com/mayswind/AriaNg/releases/tag/1.0.0 http://ariang.mayswind.net/zh_Hans/ # ...

  7. ZCU板级调试Bug记录

    本帖用以记录在ZCU102板级调试间遇到的Bug. 1.PL端的AXI总线在读取DDR中的数据的时候,在一个burst内不能跨越page boundary.跨越page boundary会在该burs ...

  8. selenium chrome 自动加载flash

    #coding:utf-8from selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom ...

  9. thinkphp或者kohana 导入和读取文件

    1.无论是那个框架的导入,其实都是一样的原理的,但是首先我们要导入包,可能就这点不同. kohana的导入包的方法:require_once(Kohana::find_file('vendor','P ...

  10. Git的各种状态

    考:http://blog.csdn.net/wirelessqa/article/details/19548057 按照文件的存放位置分: 在你自建的Git本地仓库中,有三个区域:本地目录.暂存区. ...