C语言中cin和cout高级格式化操作

 

  这篇文章主要讲解如何在C++中使用cin/cout进行高级的格式化输出操作,包括数字的各种计数法(精度)输出,左或右对齐,大小写等等。通过本文,您可以完全脱离scanf/printf,仅使用cin/cout来完成一切需要的格式化输入输出功能(从非性能的角度而言)。更进一步而言,您还可以在、上使用这些格式化操作,从而代替sscanf/sprintffscanf/fprintf函数。为方便描述,下文仅以cin/cout为例进行介绍。

  控制符是在头文件iomanip.h中定义的对象。使用前必须把iomanip.h包含进来

  1. I/O的书写格式

I/0流是输入或输出的一系列字节,当程序需要在屏幕上显示输出时,可以使用插入操作符""cout输出流中插入字符。例如:

  当程序需要执行键盘输入时,可以使用抽取操作符""cin输人流中抽取字符。例如:

  int myAge;

  cinmyAge;

  不管把什么基本数据类型的名字或值传给流,它都能懂。

例如,下面的函数输出字符串和整数:

  上面的输出也可以在同一行中串连,下面的输出语句与上例输出同样内容

  也可以分在几行,提高可读性,下列语句与上例输出同样结果:

  cout"My name is Jone n" //行末无分号

  《"the ID is"

  《2

  《endl;

  cin可以和cout一样的方式调整行,它自动识别变量位置和类型。例如:

  int i;float f;long l;

  cin i f l;

  cin能够知道抽取的变量之类型,它将对i,f,l分别给出一个整型、浮点型和长整型数。

  2.使用控制符

  流的默认格式输出有时不能满足特殊要求,如:

  double average=9.400067;

  coutaverageendl;

希望显示的是9.40,即保留两位小数,可是却显示了9.40007;默认显示6位有效位。用控制符(manipulators)可以对I/O流的格式进行控制。控制符是在头文件iomanip.h中定义的对象。可以直接将控制符插入流中。常用控制符如表2-4所列。

  表2-4 I/O流的常用控制符

  使用控制符时,要在程序的头上加头文件iomanip.h.

  3.控制浮点数值显示

  使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6.

  如果setprecision(n)setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。setiosflags(ios::fixed)是用定点方式表示实数。

  如果与setiosnags(ios::scientific)合用,可以控制指数表示法的小数位数。setiosflags(ios::scientific)是用指数方式表示实数。

例如,下面的代码分别用浮点、定点和指数方式表示一个实数:

  运行结果为:

  3.14286

  3

  3

  3.1

  3.14

  3.143

  3.14285714

  3.14285714e+00

  该程序在32位机器上运行通过。

  在用浮点表示的输出中,setprecision(n)表示有效位数。

  第1行输出数值之前没有设置有效位数,所以用流的有效位数默认设置值6:2个输出设置了有效位数0,C++最小的有效位数为1,所以作为有效位数设置为1来看待:第3~6行输出按设置的有效位数输出。

  在用定点表示的输出中,setprecision(n)表示小数位数。

  第7行输出是与setiosflags(ios::fixed)合用。所以setprecision(8)设置的是小数点后面的位数,而非全部数字个数。

  在用指数形式输出时,setprecision(n)表示小数位数。

  第8行输出用setiosflags(ios::scientific)来表示指数表示的输出形式。其有效位数沿用上次的设置值8.

  小数位数截短显示时,进行45入处理。

  4.设置值的输出宽度

  除了使用空格来强行控制输出间隔外,还可以用setw(n)控制符。如果一个值需要比setw(n)确定的字符数更多的字符,则该值将使用它所需要的所有字符。例如:

  float amount=3.14159;

  cout setw(4) amount endl;

  其运行结果为:3.14159.它并不按4位宽度,而是按实际宽度输出。

  如果一个值的字符数比setw(n)确定的字符个数更少,则在数字字符前显示空白,不同于其他控制符,setw(n)仅仅影响下一个数值输出,换句话说,使用setw设置的间隔方式并不保留其效力。例如:

  coutsetw(8)

  《10

  《20endl;

  运行结果为:

  -------1020

  运行结果中的下横线表示空格。整数20并没有按宽度8输出。setw()的默认值为宽度0,setw(0),意思是按输出数值的表示宽度输出,所以20就紧挨10了。若要每个数值都有宽度8,则每个值都要设置:

  coutsetw(8)10

  《setw(8) 20 endl;

  5.输出8进制和16进制数

  3个常用的控制符是hex,octdec,它们分别对应16进制、8进制和10进制数的显示。这3个控制符在iostream.h头文件中定义。例如:

  #include

  void main()

  {

  int number=1001;

  cout "Decimal:" dec number endl

  《"Hexadecimal:" hex number endl

  《"Octal:" oct number endl;

  }

  运行结果为:

  Decimal:1001

  Hexadecimal:3e9

  Octal:1751

  1001是一个10进制数,不能把它理解成16进制或8进制数,因为它不是以0x0开头。但在输出时,流根据控制符进行过滤,使其按一定的进制来显示。

  用头文件iomanip.h中的setiosflags(ios::uppercase)可以控制16进制数大写输出。例如,上例中增加一个头文件,对16进制数进行大写控制,即:

  #include

  #include

  //

  cout"Hexadecimal:"hex

  《setiosftags(ios::uppercase)

  《numberendl;

  便能得到16进制数的大写表示:Hexadecimal:3E9.

 6.设置填充字符

  setw可以用来确定显示的宽度。默认时,流使用空格符来保证字符间的正确间隔。用setfill控制符可以确定一个非空格的别的字符。Setfill在头文件iomanip·h中定义。例如:

  运行结果为:

  21

  *21

  **21

  7.左右对齐输出

  默认时,I/O流左对齐显示的内容。使用头文件iomanip.h中的setiosflags(ios::left)(ios::right)标志,可以控制输出对齐。例如:

  #include

  #include

  void main()

  {

  cout setiosflags(ios::right)

  《setw(5) 1

  《setw(5) 2

  《setw(5) 3 endl;

  cout setiosflags(ios::left)

  《setw(5) 1

  《setw(5) 2

  《setw(5) 3 endl;

  }

  运行结果为:

  -----1-----2-----3

  1-----2-----3-----

  8.强制显示小数点和符号

  当程序输出下面的代码时:

  cout10.0/5endl;

  默认的I/0流会简单地显示2,而非2.0,因为除法的结果是精确的。当需要显示小数点时,可以用iso::showpoint标志。例如:

  #include

  #include

  void main()

  {

  cout 10.0/5 endl;

  cout setiosflags(ios::showpoint)

  《10.0/5 endl;

  }

  运行结果为:

  2

  2.00000

  默认时,I/O流仅在负数之前显示值的符号,根据程序的用途,有时也需要在正数之前加上正号,可以用ios::showpos标志。例如:

  #include

  #include

  void main()

  {

  cout 10 " " -20 endl;

  cout setiosflags(ios::showpos)

  《10 " " -20 endl;

  }

  运行结果为:

  10 -20

  +10 -20

  小结

  变量是程序分配给某个内存位置的名字,它可以存放信息。程序在使用变量前,必须先说明变量名和变量类型。

  不同的变量不能同名,变量名应该尽量反映出变量的用途,以增强程序的可读性。

  在程序运行中,常量的值不可改变。常量也有各种数据类型,也占有存储空间。各种数据类型的数据表示有一定的范围,越过了该范围, C++就要对该数据进行截取,使得数据不再正确。

  利用cout可以输出各种数据类型的数据,可以多种方式在屏幕上显示输出信息(包括特殊符号)

  C++兼容C的库函数,所以printf()scanf()也可照常使用。

原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/1/12329001.shtml

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值