C++ I/O 流 格式控制(上)

在学习C++这么久以来,虽然一直使用着输入输出流,但是对它们却并没有进行系统的了解和学习。在最近,将它们的一些基本用法进行了一次简单的归纳。

使用ios类的成员函数进行格式控制

格式状态字

C++可以对流对象的输入输出进行格式控制,以此来完成各种各样的格式需求。在ios的public部分定义了一个枚举,它的每个成员都是一个状态标志位:

1)skipws (默认设置)
从一个流中输入时,将跳过开头的空白字符(空格,制表符,换行符)。
2)left、right、internal (默认 right)
left:输出左对齐,域宽的其余部分用填充符填充;
right:同left相反;
internal:数值的符号左对齐,数值本身右对齐,之间为填充符。
3)dec、oct、hex (默认 dec)
十进制、八进制、十六进制。
4)showbase (默认不设置)
基指示符,若同时设置hex,则数据会加上前缀 “0x”。
5)showpoint (默认不设置)
强制显示浮点型数据小数点后的无效0。
6)uppercase (默认不设置)
字母大写显示。
7)showpos (默认不设置)
显示正数时,前面加“+”进行强调。
8)scientific、fixed(编译程序会根据情况选择)
scientific:浮点数用科学记数法输出;
fixed:浮点数按常规显示。
接下来两个格式状态字与缓冲区有关
9)unitbuf
输出后立即刷新所有流,即把输出流写到与流相连的物理设备上。
10)stdio
每次输出后,刷新stdout和stderr。
stdout:输出方式为行缓冲;
stderr:不带缓冲。

用于控制输入输出格式的成员函数

函数名作用
long ios::flags( )返回当前格式状态字
long ios::flags(long)设置格式状态字并返回
long ios::setf(long)追加指定的格式状态字
long ios::unsetf(long)清除指定的格式状态字
int ios::width()返回当前显示数据的域宽
int ios::width(int)设置域宽并返回原域宽
char ios::fill()返回当前填充字符
char ios::fill(char)设置填充字符并返回原填充字符
int ios::precision()返回当前浮点数的精度
int ios::precision()设置浮点数精度并返回原精度
格式状态字
long f;
int a = 10;
double b = 100.00;
f = cout.flags();
 cout << "The flags's result is " << f << endl;
 cout << "a = " << a << "\t b = " << b << endl;
 cout.setf(ios::showpoint);
 cout << "b = " << b << endl;
 cout.unsetf(ios::showpoint | ios::dec);
 cout.setf(ios::hex | ios::showbase);
 cout << "十六进制:" << endl;
 cout << "a = " << a << endl;
 cout << "b = " << b << endl;
 cout.setf(ios::scientific);
 cout << "科学计数法:" << endl;
 cout << "a = " << a << endl;
 cout << "b = " << b << endl;
 cout.setf(ios::uppercase);
 cout << "字母大写:" << endl;
 cout << "a = " << a << endl;
 cout << "b = " << b << endl;

vs2017运行,控制台输出结果:
在这里插入图片描述
①在使用格式状态字设置函数时,可使用“|”进行同时设置;
②进制变换对浮点数无任何作用;
③在进行进制变换时,必须先清除当前进制,再设置新的进制。

填充字符与域宽
 int a = 100;
 double b = 12.30895;
 int length = cout.width();
cout <<"The initial width is "<< length << endl;
 cout.width(2);
 cout << a << endl;
 cout.width(10);
 cout.fill('#');
 cout << a << endl;
 cout << a << endl;
 cout << "未调整精度:" << endl;
 cout << b << endl;
 cout.precision(10);
 cout << "调整后:" << endl;
 cout.width(10);
 cout << b << endl;
 cout << b << endl;
 cout.setf(ios::showpoint);
 cout << "强制显示无效0:" << endl;
 cout << b << endl;

vs2017运行,控制台输出结果:
在这里插入图片描述
①初始域宽为0,数据按自身长度打印;
②当设置域宽长度小于数据自身长度时,并不会改变数据的输出,
小数点也在域宽中占一个长度;
③当width()设置域宽后,只对之后的第一个输出有影响,而fill()与precision()一直有效;
④默认填充字符为空格,默认有效数字为6位。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值