C++ 极简总结—— I/O 流类库(二)

C++ 格式化输入输出

c++的I/O流类库提供了两种控制格式输入输出的方法:

  1. 一种是使用ios类的成员函数。
  2. 另一种是使用控制符。
1、使用ios类的成员函数设置标志字。

(1) 、ios类中声明了一个数据成员用于记录当前流的格式化状态。这个数据成员就是标志字

  • 格式控制常量表
标志常量Value含义
ios::skipws0x0001跳过输入中的空白符
ios::left0x0002输出数据按输出域左对齐
ios::right0x0004输出数据按输出域右对齐
ios::internal0x0008数据的符号左对齐,数据本身右对齐,符号和数据之间为填充符
ios::dec0x0010十进制
ios::oct0x0020八进制
ios::hex0x0040十六进制
ios::showbase0x0080输出的数值数据前面带有基数符号(0或者0x)
ios::showpoint0x0100浮点数输出带有小数点
ios::uppercase0x0200用大写字母输出十六进制数
ios::showpos0x0400正数 ‘+’符号
ios::fixed0x0800使用定点数表示浮点数,没有指数部分
ios::scientific0x1000科学计数表示
ios::unitbuf0x2000完成输入操作后立即刷新流的缓冲区
ios::stdio0x2000完成输入操作后刷新系统的stdout、stderr
  • 操作标志字的公有函数

    • long flags() :返回标志字
    • long flags(long):更新标志字,返回更新前的标志字
    • long setf(long setbits,long field):将field 指定的标志位清零,将setbits所指的标志位置一
    • long setf(long):设置参数所指定的标志位
    • long unsetf(long):清除参数所指定的标志位

    例子:

#include <iostream>

using namespace std;

int main()
{
    double num = 12.34;
    cout<<"num = "<<num<<endl;
    cout.setf(ios::showpos);
    cout<<"num = "<<num<<endl;
    cout.setf(ios::scientific);
    
    cout<<"num = "<<num<<endl;
    return 0;
}

输出:

num = 12.34
num = +12.34
num = +1.234000e+001

或者:

#include <iostream>
using namespace std;
int main()
{
    double num = 12.34;
    cout<<"num = "<<num<<endl;
    cout.setf(ios::showpos|ios::scientific);
    cout<<"num = "<<num<<endl;
    return 0;
}

流格式标志字的每一位表示一种格式,格式位之间会有依赖关系。为了清除同类排斥位,ios类定义了几个公有静态符号常量:

static const long basefield;    //值为dec、oct、hex
static const long adjustfield;  //其值为 left、right、internal
static const long floatfield;   //scientific、fixed 

例子:

int num1 = 12;
cout.setf(ios::showbase);
cout.setf(ios::dec,ios::basefield);
cout<<"以十进制输出:"<<num1<<endl;

cout.setf(ios::oct,ios::basefield);
cout<<"以八进制输出:"<<num1<<endl;

cout.setf(ios::hex,ios::basefield);
cout<<"以十六进制输出:"<<num1<<endl;

结果:

以十进制输出:12
以八进制输出:014
以十六进制输出:0xc

(2)、使用ios类成员函数设置域宽,填充字符及输出精度
a.设置输出数据所占宽度的函数。

  • int width() 该函数用来返回当前的数据宽度
  • int width(int)设置数据输出宽度, 返回之前的数据宽度
    该函数设置的宽度仅对下一个流有效,下一个流输出之后,宽度又为0了。

b、填充当前宽度内的填充字符函数

  • char fill() 返回当前所使用的填充字符
  • char fill(char) 设置填充字符,返回之前用的字符

c、设置浮点数的输出精度

  • int percision() 返回当前浮点数的有效数字个数
  • int percision(int) 设置浮点数的有效数字个数,返回之前的值。

注意

  • 数据输出宽度在默认情况下为表示该数据所需要的最少字符数。
  • 默认情况下的填充字符为空格符
  • 如果设置的数据宽度小于所需的,则按默认宽度处理
  • 单精度7位,双精度15位,长双进度19位。

例子:

double values[] = {1.23,35.36,653.7,4358.24};
for(int i = 0;i < 4;i++)
{
    cout.setf(ios::left);
    cout.fill('*');
    cout.width(10);
    cout<<values[i]<<endl;
}

结果:

1.23******
35.36*****
653.7*****
4358.24***
2、使用控制符进行格式控制。

在这里插入图片描述

例子:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    float num2 = 13.4;
    cout<<setiosflags(ios_base::left)<<setfill('*')<<setw(10)<<num2<<endl;
    return 0;
}

结果:

13.4******
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_33728095

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值