C++之预定义类型IO格式控制

原文传送门:http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/17/2142010.html


在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函数搭配。

下面用示例来验证:

#include <iostream>
#include <string>
#include <iomanip>  //带形参的操作符需要包含该头文件
using namespace std;

void main()
{
	cout.setf(ios::left | ios::showpoint | ios::unitbuf);
	cout.precision(6);
	cout << 123.45678;
	cout.width(50);
	cout.fill('-');
	cout.unsetf(ios::left);
	cout.setf(ios::right);
	cout << "十进制小数输出,有效数字为6位" << endl;

	cout.setf(ios::left | ios::fixed);
	cout.precision(6);
	cout << 123.45678;
	cout.width(50);
	cout.fill('-');
	cout.unsetf(ios::left | ios::fixed);
	cout.setf(ios::right);
	cout << "固定小数位fixed,有效数字为6位" << endl;

	cout.setf(ios::left | ios::scientific);
	cout.precision(6);
	cout << 123.45678;
	cout.width(50);
	cout.fill('-');
	cout.unsetf(ios::left | ios::scientific);
	cout.setf(ios::right);
	cout << "科学计数法表示,有效数字为6位" << endl;

	cout.fill(' ');
	cout.unsetf(ios::right);

	cout.setf(ios::dec | ios::showpos | ios::internal);
	cout.width(6);
	cout << 128 << endl;
	cout.unsetf(ios::dec);

	cout.setf(ios::oct | ios::showbase);
	cout << 128 << endl;
	cout.unsetf(ios::oct);

	cout.setf(ios::hex | ios::uppercase);
	cout << 128 << endl;
	cout.unsetf(ios::hex);
}

结果:

  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)的部分状态标志:

下面用示例来验证:

#include <iostream>
#include <string>
#include <iomanip>  //带形参的操作符需要包含该头文件
using namespace std;

void main()
{
	string str = "abcdefg";
	cout << str << ends << endl;

	cout << setiosflags(ios::left | ios::showpoint | ios::unitbuf) << setprecision(6) << 123.45678 
		 << setw(50) << setfill('-') << resetiosflags(ios::left)
		 << setiosflags(ios::right) << "十进制小数输出,有效数字为6位" << endl;

	cout << setiosflags(ios::left | ios::fixed) << setprecision(6) << 123.45678 
		<< setw(50) << setfill('-') << resetiosflags(ios::left | ios::fixed)
		<< setiosflags(ios::right) << "固定小数位fixed,有效数字为6位" << endl;

	cout << setiosflags(ios::left | ios::scientific) << setprecision(6) << 123.45678 
		<< setw(50) << setfill('-') << resetiosflags(ios::left | ios::scientific)
		<< setiosflags(ios::right) << "科学计数法表示,有效数字为6位" << endl;

	cout << setfill(' ') << resetiosflags(ios::right) << flush << endl;

	cout << setiosflags(ios::dec | ios::showpos | ios::internal) << setw(6) << 128 << resetiosflags(ios::dec) << endl;

	cout << setiosflags(ios::oct | ios::showbase) << 128 << resetiosflags(ios::oct) << endl;

	cout << setiosflags(ios::hex | ios::uppercase) << 255 << resetiosflags(ios::hex) << endl;
}


结果:

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

输出流自定义操纵符

ostream &操纵符名(ostream &s)

{

  自定义代码

  return s;

}

输入流自定义操纵符

istream &操纵符名(istream &s{

  自定义代码

  return s;

}

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

用示例来验证:

#include "stdafx.h"
#include <iostream>
#include <iomanip>

std::ostream& outputNo(std::ostream& s)//编号格式如:0000001
{
    s<<std::setw(7)<<std::setfill('0')<<std::setiosflags(std::ios::right);
return s;
}

std::istream& To16(std::istream& s)//要求输入的数为十六进制数
{
    s>>std::hex;
return s;
}


int main()
{
    std::cout<<outputNo<<8<<std::endl;

int a;
    std::cout<<"请输入十六进制的数:";
    std::cin>>To16>>a;
    std::cout<<"转化为十进制数:"<<a<<std::endl;

return0;
}


结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值