C 的输出格式控制技巧分析
创始人
2024-07-25 15:20:22
0

C++中,将数据从一个对象到另一个对象的流动抽象为“流”(stream)。按流动的方向不同,构成输入/输出流。对于流数据的输入输出格式,C++提供了两种不同的控制方式,一种是使用ios_base类提供的setf、width等函数设置输入输出格式,另一种是通过重载的格式控制符“<<”、“>>”以及流格式控制对象进行设置。

大部分流的输入输出格式可以用setf函数来设置。该函数有两种重载形式。其但参数的setf原型为:

fmtflage setf(fmtfalg flag)

参数flag说明所要设置的格式,由ios_base给出,可取如下枚举常量:

 

  1. enum{  
  2. left =0x0001, //在域中靠左输出  
  3. right =0x0002, //在域中靠右输出  
  4. internal =0x0004, //符号靠左数值靠右输出,中间默认以空格填充  
  5. dec =0x0008, //数值以十进制输出  
  6. hex =0x0010, //以16进制输出  
  7. oct =0x0020, //8进制输出  
  8. fixed =0x0040, //浮点数以小数方式输出  
  9. scientific =0x0080, //浮点数以科学计数方式输出  
  10. boolalpha =0x0100, //布尔值以true/false方式输出  
  11. showbase =0x0200, //8进制前面加0做指示符,16进制前面加0x做指示符  
  12. showpoint =0x0400, //不管小数点和尾部的0是否可省略不写,都输出小数点和0  
  13. showpos =0x0800, //在正数前面输出+号  
  14. skipws =0x1000, //不读入空白字符(空格,制表符\t,回车\r,和换行\n)  
  15. unitbuf =0x2000, //每次写入数据都刷新到相应设备  
  16. uppercase =0x4000, //科学计数法的"e"和16进制计数的"x",大写输出为"E"和"X"  
  17. adjustfield =left | right | internal, //一般用作对齐方式的屏蔽码  
  18. basefield =dec | hex | oct, //一般用作数值进制输出方式的屏蔽码  
  19. floatfield =scientific | fixed //一般用作浮点数输出方式的屏蔽码  
  20. };  

 

一般用派生类ios作前缀”ios::”使用以上枚举值.

Setf函数的另一个使用原型如下:

Fmtflags setf(fmtflags flag,fmtflags mask)

其中第二个函数mask为隐码格式.例如设置adjustfield,basefield和floatfield格式.组成隐码格式的所有格式会首先被复位,然后用***个参数flag去设置新格式.

对于setf函数设置的格式,可用unsetf函数进行复位.下面是他的原型,参数mask为所要复位的格式.

Void unsetf(fmtflags mask)

下面程序使用setf/unsetf函数对内建的cout流进行格式设置和复位.

 

  1. #include  
  2. using namespace std;  
  3. int main(void)  
  4. {  
  5. //科学计数方式显示,大写E  
  6. cout.setf(ios::scientific | ios::uppercase);  
  7. cout<<2006.5<  
  8. //下面的showpos不起作用,不会显示出"+"号  
  9. cout.setf(ios::floatfield,ios::fixed | ios::showpos);  
  10. cout<<2006.5<  
  11. //显示"+"号  
  12. cout.setf(ios::showpos);  
  13. cout<<2006.5<  
  14. return 0;  
  15. }  
  16.  

 

对于流的其他格式,如输出的最小宽域、数值精度以及填充字符的格式设置,可以使用ios_base类提供的width和precision函数,以及ios类提供的fill函数.

Width函数用newwidth设置新的最小域宽,如果输出不足以占满整个域,会补充适当的前导空格或者前导0.

Streamsize width(streamsize newwidth)

默认的数值精度为6位有效数字,可用precision函数将参数newprecision设置为新的精度值,数值输出时会按这个精度进行必要的四舍五入.

Streamsize precision(streamsize newprecision)

默认的填充字符为空格字符,可以用fill函数将参数fill_char字符设置为填充字符

Char_type fill(char_type fill_char)

下面示例程序对cout流进行了域宽、精度和填充字符等流格式进行了设置。

 

  1. #include  
  2. using namespace std;  
  3. int main(void)  
  4. {  
  5. cout.width(20);  
  6. cout<<"hello"<  
  7. cout.precision(4);  
  8. cout<<2009.228<  
  9. cout.precision(5);  
  10. cout<<2009.228<  
  11. cout.precision(7);  
  12. cout<<2009.228<  
  13. cout.width(20);  
  14. cout.fill('*');  
  15. cout<<"baby"<  
  16. return 0; 

 

本文从C++流的概念和输入输出格式控制的方法,两方面简单的介绍了C++流,也就是我们经常说的I/O流。希望能对读者有所帮助。

【编辑推荐】

  1. C++之运算符重载,输入输出流详细介绍
  2. 2.2.3 输入输出流
  3. C++标准输入输出应用技巧解析
  4. 3.2 组合输入输出流

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...