c++IO之预定义格式控制

在C语言里,我们可以通过函数printf和scanf来进行格式化控制。而在C++中仍然包含了前者,但还提供了以下两种格式控制的方法:(1)使用流成员函数进行格式控制;(2)使用预定义操作符进行格式控制。下面我来一一介绍:

  1.流成员函数主要是指ios类(流基类)中的,分别有:

(1).设置状态标志流成员函数setf

一般格式:long ios::setf(long flags),调用格式:流对象.setf(ios::状态标志)

ios类的状态标志有:

因为状态标志在ios类中定义为枚举值,所以在引用这些值前要加上ios::,如果有多项标志,中间则用"|"分隔;

(2).清除状态标志流成员函数unsetf

一般格式:long ios::unsetf(long flags),调用格式:流对象.unsetf(ios::状态标志);

(3).设置域宽流成员函数width

一般格式:int ios::width(int n),调用格式:流对象.width(n);//注:它只对下一个流输出有效,输出完成后,恢复默认值0

(4).设置实数的精度流成员函数precision

一般格式:int ios::precision(int n),调用格式:流对象.precision(n);//注:参数n在十进制小数形式输出时代表有效数字。在以fixed形式和scientific形式输出时代表小数位数

(5).填充字符流成员函数fill

一般格式:char ios::fill(char ch),调用格式:流对象.fill(ch);//注:当输出值不满宽域时用填充符来填充,默认填充符为空格,它与width函数搭配。

下面用示例来验证:

 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include <string>
 4
 5 int main()
 6 {
 7     std::cout.setf(std::ios::left|std::ios::showpoint|std::ios::unitbuf);
 8     std::cout.precision(6);
 9     std::cout<<123.45678;
10     std::cout.width(50);
11     std::cout.fill(‘-‘);
12     std::cout.unsetf(std::ios::left);//清除状态左对齐
13     std::cout.setf(std::ios::right);
14     std::cout<<"十进制小数输出,有效数字为6位"<<std::endl;
15
16     std::cout.setf(std::ios::left|std::ios::fixed);
17     std::cout.precision(6);
18     std::cout<<123.45678;
19     std::cout.width(50);
20     std::cout.fill(‘-‘);
21     std::cout.unsetf(std::ios::left|std::ios::fixed);//清除状态左对齐和定点格式
22     std::cout.setf(std::ios::right);
23     std::cout<<"固定小数位fixed,小数位为6位"<<std::endl;
24
25     std::cout.setf(std::ios::left|std::ios::scientific);
26     std::cout.precision(6);
27     std::cout<<123.45678;
28     std::cout.width(50);
29     std::cout.fill(‘-‘);
30     std::cout.unsetf(std::ios::left|std::ios::scientific);//清除状态左对齐和科学计数法格式
31     std::cout.setf(std::ios::right);
32     std::cout<<"科学计数法表示,小数位为6位"<<std::endl;
33
34     std::cout.fill(‘‘);//设置填充符为默认空格
35     std::cout.unsetf(std::ios::right);//清除状态靠右对齐
36
37     std::cout.setf(std::ios::dec|std::ios::showpos|std::ios::internal);//设置状态基数为10,正整数前显示"+"和数据符号左对齐,数据本身右对齐,数据和符号之间为填充符‘ ‘
38     std::cout.width(6);
39     std::cout<<128<<std::endl;
40     std::cout.unsetf(std::ios::dec);//清除状态基数为10
41
42 //在输出整数的八进制形式或十六进制形式之前
43 //先要把默认的十进制形式的标志清除std::cout.unsetf(std::ios::dec)
44     std::cout.setf(std::ios::oct|std::ios::showbase);//设置状态基数为8,输出整数时显示基数符号
45 //std::ios::internal标志对八进制不起作用
46     std::cout<<128<<std::endl;
47     std::cout.unsetf(std::ios::oct);//清除状态基数为8
48
49     std::cout.setf(std::ios::hex|std::ios::uppercase);//设置状态基数为16,输出整数时显示基数符号和科学计数法输出时E大写,十六进制字母大写
50 //std::ios::internal标志对十六进制不起作用
51     std::cout<<255<<std::endl;
52     std::cout.unsetf(std::ios::hex);//清除状态基数为16
53
54 return0;
55 }

结果:

  2.用ios类中的成员函数来进行IO格式的控制总需要写一条单独的语句,而不能直接嵌入到IO语句中去,显得很不方便。因此C++又提供了一种用操纵符来控制IO的格式。操纵符分为带参和不带参的两种,带参的定义在头文件iomanip.h中,不带参的定义在iostream.h中。下面分别是C++中的预定义操作符:

(1)dec:设置整数基数为10,用于输出和输入;

(2)hex:设置整数基数为16,用于输出和输入;

(3)oct:设置整数基数为8,用于输出和输入;

(4)ws:跳过输入的空格符,用于输入;

(5)endl:输出一个换行符并刷新输出流,用于输出;

(6)ends:插入一个空字符null,通常用来结束一个字符串,用于输出;

(7)flush:刷新一个输出流,用于输出;

(8)setbase(n):设置整数的基数为n(可取0或10代表十进制,8代表八进制和16代表十六进制,默认为0),用于输入和输出;

(9)setfill(c):设置填充符(默认为空格),用于输出;

(10)setprecision(n):设置实数精度n,原理和成员函数precision一样,用于输出;

(11)setw(n):设置域宽n,用于输出;

(12)setiosflags(flags):设置指定状态标志,多个用"|"分隔,用于输出和输入;

(13)resetiosflags(flags):清除指定状态标志,多个用"|"分隔,用于输出和输入;

操作符setiosflags(flags)和resetiosflags(flags)的部分状态标志:

下面用示例来验证:

 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include <iomanip>//带形参的操纵符必须含有该头文件
 4 #include <string>
 5
 6 int main()
 7 {
 8     std::string str="abcdefg";
 9     std::cout<<str<<std::ends<<std::endl;//std::ends用来结束一个字符串
10
11
12     std::cout<<std::setiosflags(std::ios::left|std::ios::showpoint|std::ios::unitbuf)<<std::setprecision(6)
13 <<123.45678<<std::setw(50)<<std::setfill(‘-‘)<<std::resetiosflags(std::ios::left)
14 <<std::setiosflags(std::ios::right)<<"科学计数法表示,小数位为6位"<<std::endl;
15
16     std::cout<<std::setiosflags(std::ios::left|std::ios::fixed)<<std::setprecision(6)
17 <<123.45678<<std::setw(50)<<std::setfill(‘-‘)<<std::resetiosflags(std::ios::left|std::ios::fixed)
18 <<std::setiosflags(std::ios::right)<<"固定小数位fixed,小数位为6位"<<std::endl;
19
20     std::cout<<std::setiosflags(std::ios::left|std::ios::scientific)<<std::setprecision(6)
21 <<123.45678<<std::setw(50)<<std::setfill(‘-‘)<<std::resetiosflags(std::ios::left|std::ios::scientific)
22 <<std::setiosflags(std::ios::right)<<"科学计数法表示,小数位为6位"<<std::endl;
23
24     std::cout<<std::setfill(‘‘)<<std::resetiosflags(std::ios::right)<<std::flush;//std::flush刷新一个输出流
25
26     std::cout<<std::dec//或std::setbase(10或0)
27 <<std::setiosflags(std::ios::showpos|std::ios::internal)<<std::setw(6)<<128<<std::endl;
28
29     std::cout<<std::setbase(8)//或std::oct
30 <<std::setiosflags(std::ios::showbase)<<128<<std::endl;
31
32     std::cout<<std::setbase(16)//或std::hex
33 <<std::setiosflags(std::ios::showbase|std::ios::uppercase)<<255<<std::endl;
34
35 return0;
36 }

结果:

  3.除了利用系统预定义的操纵符来进行IO格式的控制外,用户还可以自定义操纵符来合并程序中频繁使用的IO写操作。定义形式如下:

输出流自定义操纵符

ostream &操纵符名(ostream &s)

{

  自定义代码

  return s;

}

输入流自定义操纵符

istream &操纵符名(istream &s{

  自定义代码

  return s;

}

返回流对象s很关键,否则操纵符就不能用在流的IO操作序列中。

用示例来验证:

 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include <iomanip>
 4
 5 std::ostream& outputNo(std::ostream& s)//编号格式如:0000001
 6 {
 7     s<<std::setw(7)<<std::setfill(‘0‘)<<std::setiosflags(std::ios::right);
 8 return s;
 9 }
10
11 std::istream& To16(std::istream& s)//要求输入的数为十六进制数
12 {
13     s>>std::hex;
14 return s;
15 }
16
17
18 int main()
19 {
20     std::cout<<outputNo<<8<<std::endl;
21
22 int a;
23     std::cout<<"请输入十六进制的数:";
24     std::cin>>To16>>a;
25     std::cout<<"转化为十进制数:"<<a<<std::endl;
26
27 return0;
28 }

结果:

c++IO之预定义格式控制

时间: 2024-11-03 21:18:29

c++IO之预定义格式控制的相关文章

Linux mysql shell脚本 变量和环境变量 位置参数 预定义变量 运算符 判断 流程控制 for循环 与用户交互 函数

mysql 1. 卸载旧版本 rpm -qa | grep mysql 检查是否有旧版本 查询结果:mysql-libs-5.1.73-7.el6.x86_64 rpm -e mysql-libs 删除旧版本 rpm -e --nodeps mysql-libs 强行删除 2. 安装mysql 2.1 安装源码需要编译 下载c的编译工具 yum -y install make gcc-c++ cmake bison-devel ncurses-devel 2.2 xftp连接上传 xftp连接上

jqGrid预定义的格式化类型formatter

下表列出了jqGrid中的预定义格式化类型 所有预定义类型和编辑模式兼容,就是说数字,链接和email等需要转换,才能使他们被正确编辑 类型 选项(默认值参考语言选项) 描述 integer thousandsSeparator,defaulValue thousandsSeparator:指定千位分隔符号 defaultValue :指定数据为空时默认显示的值 number decimalSeparator,thousandsSeparator,decimalPlaces,defaulValu

CentOS 文件通配符;预定义字符;简单举例

文件通配符使用举例 *            匹配零个或者多个字符 ~]# ls x*      比如搜索以x开头的文件或者目录 ?            匹配任何单个字符 ~]# ls x?      搜索以x打头的文件或者目录  单个字符补上 ^            取得反向值 ~            当前用户家目录 ~]# cd            回到家目录 ~username    ~]# cd ~makangbo  回到用户家目录 ~]# ll ~/         也可以访问

PHP魔术函数、魔术常量、预定义常量

一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__destruct() 当删除一个对象或对象操作终止时被调用. 3.__call() 对象调用某个方法, 若方法存在,则直接调用:若不存在,则会去调用__call函数. 4.__get() 读取一个对象的属性时,若属性存在,则直接返回属性值: 若不存在,则会调用__get函数. 5.__set() 设置一个

10.23上午 PHP数组(数组正则表达式、数组、预定义数组)

正则表达式 1.替换 $s = "hello5world"; $s = preg_replace("/\d/","#",$s); echo $s;//输出结果为hello#world,数字被替换成了#. //第一个数字是被替换的内容,"/\d/"表示正则表达式的数字.//第二个参数是要用什么来替换.//第三个参数是要操作的数组. 2.拆分 //$s = "hello5world"; //$attr = pr

Shell 变量详解教程之位置变量与预定义变量。

Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一.   自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell变量.y=3a+2b,就是把3a+2b这个值赋予y.变量名是以字母或下线符打头的,可以从第二位开始加入数字,并且大小写字母意义不同.如dir与Dir是不同的变量.变量名的长度不受限制.比如:expert=Bill,就是将Bill赋值给expert,后来脚本读取变量$expert时,会取值为Bill

php预定义常量&amp;变量

PHP中可以使用预定义常量获取PHP中的信息,常用的预定义常量如下表所示. 常量名 功能  _FILE_ 默认常量,PHP程序文件名 _LINE_ 默认常量,PHP程序行数  PHP_VERSION 内建常量,PHP程序的版本,如3.0.8_dev  PHP_OS 内建常量,执行PHP解析器的操作系统名称,如Windows TRUE 该常量是一个真值(true)  FALSE 该常量是一个假值(false)  NULL 一个null值   E_ERROR 该常量指到最近的错误处 E_WARNIN

Attribute(一)——预定义特性

在项目中接触到了Attribute,那么什么是Attribute,有些什么作用呢?这里来了解一下. 一.什么是Attribute Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联.目标元素可以是程序集.类.构造函数.委托.枚举.事件.字段.接口.方法.可移植可执行文件模块.参数.属性 (Property).返回值.结构或其他属性 (Attribute) 在这里,我们需要将Attribute和property分开 property是指类想外提供的字段,它属于面向对象层

(一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__

作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作符 4) 不定参数宏定义以及__VA_ARGS__ 5) 宽窄字符串连接 这些特性并不像语法规则一样常用,并且有的C++编译器实现也都先于标准地将这些特性实现,因此可能大多数程序员没有发现这些不兼容.但将这些C99的特性在C++11中标准化无疑可以更广泛地保证两者的兼容性.我们来分别看一下. 这次,