C++中cout.setf(ios::left field,ios::adjustfield); cout.setf(ios::showpoint,ios::showpint);

这篇文章主要讲解如何在中使用cin/cout进行高级的格式化输出操作,包括数字的各种计数法(精度)输出,左或右对齐,大小写等等。通过本文,您可以完全脱离scanf/printf,仅使用cin/cout来完成一切需要的格式化输入输出功能(从非性能的角度而言)。更进一步而言,您还可以在&sstream&、&fstream&上使用这些格式化操作,从而代替sscanf/sprintf和fscanf/fprintf函数。为方便描述,下文仅以cin/cout为例进行介绍。
  一、综述
  cin/cout是STL库提供的一个iostream实例,拥有ios_base基类的全部函数和成员数据。进行格式化操作可以直接利用setf/unsetf函数和flags函数。cin/cout维护一个当前的格式状态,setf/unsetf函数是在当前的格式状态上追加或删除指定的格式,而flags则是将当前格式状态全部替换为指定的格式。cin/cout为这两个函数提供了如下参数(可选格式):
  ios::dec 以10进制表示整数
  ios::hex 以16进制表示整数
  ios::oct 以8进制表示整数
  ios::showbase 为整数添加一个表示其进制的前缀
  ios::internal 在符号位和数值的中间插入需要数量的填充字符以使串两端对齐
  ios::left 在串的末尾插入填充字符以使串居左对齐
  ios::right 在串的前面插入填充字符以使串居右对齐
  ios::boolalpha 将bool类型的值以true或flase表示,而不是1或0
  ios::fixed 将符点数按照普通定点格式处理(非科学计数法)
  ios::scientific 将符点数按照科学计数法处理(带指数域)
  ios::showpoint 在浮点数表示的小数中强制插入小数点(默认情况是浮点数表示的整数不显示小数点)
  ios::showpos 强制在正数前添加+号
  ios::skipws 忽略前导的空格(主要用于输入流,如cin)
  ios::unitbuf 在插入(每次输出)操作后清空缓存
  ios::uppercase 强制大写字母
  以上每一种格式都占用独立的一位,因此可以用“|”(位或)运算符组合使用。调用setf/unsetf或flags设置格式一般按如下方式进行:
  1 cout.setf(ios::right | ios::hex); //设置16进制右对齐
  2 cout.setf(ios::right, ios::adjustfield); //取消其它对齐,设置为右对齐
  setf可接受一个或两个参数,一个参数的版本为设置指定的格式,两个参数的版本中,后一个参数指定了删除的格式。三个已定义的组合格式为:
  ios::adjustfield 对齐格式的组合位
  ios::basefield 进制的组合位
  ios::floatfield 浮点表示方式的组合位
  设置格式之后,下面所有使用cout进行的输出都会按照指定的格式状态执行。但是如果在一次输出过程中需要混杂多种格式,使用cout的成员函数来处理就显得很不方便了。STL另提供了一套&iomanip&库可以满足这种使用方式。&iomanip&库中将每一种格式的设置和删除都进行了函数级的同名封装,比如fixed函数,就可以将一个ostream的对象作为参数,在内部调用setf函数对其设置ios::fixed格式后再返回原对象。此外&iomanip&还提供了setiosflags、setbase、setfill、setw、setprecision等方便的格式控制函数,下文会逐一进行介绍。大多数示例代码都会使用到&iomanip&,因此默认包含的头文件均为:
  1 #include &iomanip&
  2 #include &iostream&
  二、缩进
  将输出内容按指定的宽度对齐,需要用到ios::right、ios::left、ios::internal和iomanip里的setw。其中setw用于指定要输出内容的对齐宽度。以下两段代码的结果完全相同,前面是一个浮点数-456.98,后面紧跟着一个字符串“The End”以及换行符“endl”。
  代码一:
  01 #include &iomanip&
  02 #include &iostream&
  04 int main(void) {
  05 cout.flags(ios::left); //左对齐
  06 cout && setw(10) && -456.98 && &The End& &&
  07 cout.flags(ios::internal); //两端对齐
  08 cout && setw(10) && -456.98 && &The End& &&
  09 cout.flags(ios::right); //右对齐
  10 cout && setw(10) && -456.98 && &The End& &&
  11 return 0;
  代码二:
  1 #include &iomanip&
  2 #include &iostream&
  4 int main(void) {
  5 cout && left && setw(10) && -456.98 && &The End& && //左对齐
  6 cout && internal && setw(10) && -456.98 && &The End& && //两端对齐
  7 cout && right && setw(10) && -456.98 && &The End& && //右对齐
  8 return 0;
  结果:
  -456.98 The End
  - 456.98The End
  -456.98The End
  这里要额外说明的一点是,setw函数会用当前的填充字符控制对齐位置,默认的填充字符是空格。可以通过&iomanip&的setfill来设置填充字符,比如下面的代码用字符“0”作为填充字符:
  1 #include &iomanip&
  2 #include &iostream&
  4 int main(void) {
  5 cout && setfill('0') && setw(10) && 45698 &&
  6 return 0;
  结果:
  输出整数的格式有按不同进制数出:ios::hex(16进制)、ios::dec(10进制)、ios::oct(8进制),也可强制其输出符号(正数也加上“+”号前缀),对于16进制的输出还可配合ios::uppercase使所有字母以大写表示。代码示例如下:
  01 #include &iomanip&
  02 #include &iostream&
  04 int main(void) {
  05 cout.setf(ios::showpos | ios::uppercase);
  06 cout && hex && setw(4) && 12 && setw(12) && -12 &&
  07 cout && dec && setw(4) && 12 && setw(12) && -12 &&
  08 cout && oct && setw(4) && 12 && setw(12) && -12 &&
  09 cout.unsetf(ios::showpos | ios::uppercase);
  10 cout && hex && setw(4) && 12 && setw(12) && -12 &&
  11 cout && dec && setw(4) && 12 && setw(12) && -12 &&
  12 cout && oct && setw(4) && 12 && setw(12) && -12 &&
  13 return 0;
  结果:
  C FFFFFFF4
  +12 -12
  c fffffff4
  12 -12
  利用&iomanip&的setbase函数同样可以设置整数的三种进制,参数分别为8、10和16,但使用起来比上面的方法还更复杂一些,除非是特殊的代码规范要求(有些规范要求避免将常量直接作为表达式),一般不建议使用setbase。此外,还可以利用ios::showbase来为整数的前面加一个表示进制的前缀,代码如下:
  1 #include &iomanip&
  2 #include &iostream&
  4 int main(void) {
  5 cout && showbase && setw(4) && hex && 32 && setw(4) && oct && 32 &&
  6 cout && noshowbase && setw(4) && hex && 32 && setw(4) && oct && 32 &&
  7 return 0;
  结果:
  0x20 040
  上面代码中的showbase/noshobase也可以用cout的setf来代替,其结果是完全相同的:
  01 #include &iomanip&
  02 #include &iostream&
  04 int main(void) {
  05 cout.setf(ios::showbase);
  06 cout && setw(4) && hex && 32 && setw(4) && oct && 32 &&
  07 cout.unsetf(ios::showbase);
  08 cout && setw(4) && hex && 32 && setw(4) && oct && 32 &&
  09 return 0;
  四、小数
  小数可分为两种格式类型,一种是定点表示“ios::fixed”(不带指数域),另一种是科学计数法表示“ios::scientific”(带指数域)。与&iomanip&的setprecision配合使用,可以表示指定小数点后面的保留位数(四舍五入)。示例代码如下:
  01 #include &iomanip&
  02 #include &iostream&
  04 int main(void) {
  05 cout.setf(ios::fixed);
  06 cout && setprecision(0) && 12.05 &&
  07 cout && setprecision(1) && 12.05 &&
  08 cout && setprecision(2) && 12.05 &&
  09 cout && setprecision(3) && 12.05 &&
  10 cout.setf(ios::scientific, ios::floatfield);
  11 cout && setprecision(0) && 12.05 &&
  12 cout && setprecision(1) && 12.05 &&
  13 cout && setprecision(2) && 12.05 &&
  14 cout && setprecision(3) && 12.05 &&
  15 return 0;
  结果:
  12.050
  1.205000e+001
  1.2e+001
  1.21e+001
  1.205e+001
  需要注意的是,有时会因为机器的精度问题导致四舍五入的结果不正确。这种问题一般需要手动修正,见如下代码示例:
  1 #include &iomanip&
  2 #include &iostream&
  4 int main(void) {
  5 cout && fixed && setprecision(1) && 2.05 &&
  6 cout && fixed && setprecision(1) && 2.05 + 1e-8 &&
  7 return 0;
  结果:
四、字符串
  字符串的输出处理主要是对齐,这一点在第二部分已经介绍过了,下面主要介绍字符串的输入方法。为了方便起见,我们使用&string&库。在输入字符串时,可以利用&string&库提供的getline函数读取整行数据。getline函数有两个版本,第一个版本有两个参数,第一个参数指定输入流(比如cin),第二个参数指定一个string对象。getline会读取屏幕上输入的字符,直到遇到换行符“\n”为止;第二个版本有三个参数,前两个与第一个版本相同,第三个参数为指定的结束字符。注意,getline不会读入默认或指定的结束字符,但在调用之后读取的位置已经跳过结束字符。调用示例代码如下:
  01 #include &iomanip&
  02 #include &iostream&
  03 #include &string&
  05 int main(void) {
  06 string str1, str2;
  07 getline(cin, str1);
  08 cin && str2;
  09 cout && str1 && endl && str2 &&
  10 return 0;
  输入:
  结果:
  五、缓冲区
  由于调用系统函数在屏幕上逐个显示字符是很慢的,因此cin/cout为了加快速度使用缓冲区技术,粗略的讲就是暂时不输出指定的字符,而是存放在缓冲区中,在合适的时机一次性输出到屏幕上。如果单纯使用的输入/输出流来操作字符是不存在同步的问题的,但是如果要和C标准库的stdio库函数混合使用就必须要小心的处理缓冲区了。如果要与scanf和printf联合使用,务必在调用cout前加上cout.sync_with_stdio(),设置与stdio同步,否则输出的数据顺序会发生混乱。
  flush和endl都会将当前缓冲区中的内容立即写入到屏幕上,而unitbuf/nounitbuf可以禁止或启用缓冲区。示例代码如下:
  1 #include &iomanip&
  2 #include &iostream&
  4 int main(void) {
  5 cout && 123 && flush && 456 &&
  6 cout && unitbuf && 123 && nounitbuf && 456 &&
  7 return 0;
  结果:
  123456
  123456
  六、综合使用
  示例代码:
  01 #include &iomanip&
  02 #include &iostream&
  03 #include &string&
  05 struct COMMODITY { string N int Id; int C double P };
  06 int main(void) {
  07 COMMODITY cmd[] = {
  08 {&Fruit&, 0x101, 50, 5.268},
  09 {&Juice&, 0x102, 20, 8.729},
  10 {&Meat&, 0x104, 30, 10.133},
  12 cout && left && setw(8) && &NAME& && right && setw(8) && &ID&;
  13 cout && right && setw(8) && &COUNT& && right && setw(8) && &PRICE& &&
  14 for (int i = 0; i & sizeof(cmd) / sizeof(cmd[0]); ++i) {
  15 cout && left && setw(8) && cmd[i].N
  16 cout && right && hex && showbase && setw(8) && cmd[i].Id;
  17 cout && dec && noshowbase && setw(8) && cmd[i].C
  18 cout && fixed && setw(8) && setprecision(2) && cmd[i].Price &&
  20 return 0;
  结果:
  NAME ID COUNT PRICE
  Fruit 0x101 50 5.27
  Juice 0x102 20 8.73
  Meat 0x104 30 10.13
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:259266次
积分:3175
积分:3175
排名:第3903名
转载:291篇
评论:119条
(2)(4)(1)(5)(15)(6)(9)(1)(11)(6)(20)(20)(5)(4)(10)(12)(10)(4)(12)(7)(17)(16)(6)(14)(11)(6)(9)(2)(1)(12)(6)(10)(25)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
2013年第11章 C++语言的I∕O流类库.ppt65页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:150 &&
你可能关注的文档:
··········
··········
C++语言的I/O流类库 第11章
C++语言的I/O流类库 11.1
I/O流类库的功能 11.1
I/O流类库的功能 11.1.1
基本的I/O流类库 11.1.2 文件I/O操作流类库 类ifstream由类istream单一派生,专门用来处理文件的输入操作。 类ofstream由类ostream单一派生,专门用来处理文件的输出操作。 类fstream由类iostream单一派生,专门用来处理文件的输入和输出操作。 类ifstream、ofstream、fstream拥有公共基类: fstreambase。 利用上述类创建流对象,类中的成员函数open用来打开文件,成员函数close用来关闭文件,有关细节将在11.5节中讲述。 11.1.3 字符串流操作流类库 类istrstream由类istream单一派生,专门用来处理字符串的输入操作。 类ostrstream由类ostream单一派生,专门用来处理字符串的输出操作。 类strstream由类iostream单一派生,专门用来处理字符串的输入和输出操作。 类istrstream、ostrstream、strstream拥有公共基类: strstreambase。 有关字符串流操作的细节将在11.6节中讲述。 11.2
常用的读写操作 11.2.1 屏幕输出操作 1.使用预定义的插入符
是左移位运算符的重载,格式为: 字符流目的地
字符流内容 需在屏幕显示时,屏幕就是字符流目的地,头文件iostream.h中定义有ostream类的全局对象cout就代表屏幕。 使用
时应注意运算符的优先级别,必要时,用加括弧的方法保证其他运算符优先运算,例如: cout
i j?i: 如果不加
,将因运算顺序不对而编译出错。 【例11.1】插入符用法示例 #include
"字符串\"This is a string.\"的长度为:";
strlen "This is a string."
"字符串\"This is a string.\"占的空间为:";
sizeof "This is a string."
运行结果为17和18,因为strlen是求字符串的长度,即字符串中字符的个数;sizeof是
正在加载中,请稍后...cout.setf(ios::fixed,ios::floatfield); cout.precision(3); 这两句C++语句是什么意思啊!还有怎么用的?_百度知道
cout.setf(ios::fixed,ios::floatfield); cout.precision(3); 这两句C++语句是什么意思啊!还有怎么用的?
提问者采纳
cout.setf(ios_base::fixed,ios_base::floatfield)ios_base::fixed是设置cout为定点输出格式ios_base::floatfield是设置输出时按浮点格式,小数点后有6位数字cout.precision(3);这个的意义要看有没有set ios::fixed如果没有的话, 是代表3位有效数字, 不是3位小数
提问者评价
Thank you,辛苦啦!
其他类似问题
cout的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁已有天涯账号?
这里是所提的问题,您需要登录才能参与回答。
"天涯问答"是天涯社区旗下的问题分享平台。在这里您可以提问,回答感兴趣的问题,分享知识和经历,无论您在何时何地上线都可以访问,此平台完全免费,而且注册非常简单。
cout.setf(ios_base::showpoint)什么意思
cout.setf(ios_base::showpoint)什么意思
09-07-30 & 发布
日 ... 9 cout.setf(ios_base::showpoint); 10 cout.setf(ios_base::fixed); .... 什么意思? --祝你好运! 3. re: ZOJ 1298 - Domino Effect ...
请登录后再发表评论!
是为了强制显示小数点的,希望对你有用
请登录后再发表评论!vs2008中 cout.setf(ios::dec)的问题
vs2008中 cout.setf(ios::dec)的问题
&p&#include &iostream&&br&#include &iomanip&&br&&/p&
&p&void main()&br&{&br&&int n=100;&br&&cout.setf(ios::dec);&br&&cout&&&十进制&&&n&&&br&&&br&&cout.setf(ios::oct);&br&&cout&&&八进制&&&n&&&br&&&br&&cout.setf(ios::hex);&br&&cout&&&十六进制&&&n&&&br&&&br&&getchar();&br&}&/p&
&p&预想结果应该是&/p&
&p&100&/p&
&p&144&/p&
&p&64&/p&
&p&但是结果却是&/p&
&p&100&/p&
&p&100&/p&
&p&100&/p&
&p&为什么? &/p&
#include &iostream&#include &iomanip&
void main(){&int n=100;&cout.setf(ios::dec);&cout&&"十进制"&&n&&&&cout.setf(ios::oct, ios::dec);&cout&&"八进制"&&n&&&&cout.setf(ios::hex, ios::oct);&cout&&"十六进制"&&n&&&&getchar();}
#include &iostream&#include &iomanip&
void main(){&int n=100;&cout.setf(ios::dec);&cout && n &&&&cout.unsetf(ios::dec);&cout.setf(ios::oct);&cout && n &&&&cout.unsetf(ios::oct);&cout.setf(ios::hex);&cout && n &&
&cout.setf(ios::dec);&cout && n &&
&getchar();}
其他回答 (1)
#include &iostream&#include &iomanip&
void main(){&int n=100;// cout.setf(ios::dec);&cout&&"十进制"&&dec&&n&&&// cout.setf(ios::oct, ios::oct);&cout&&"八进制"&&oct&&n&&&// cout.setf(ios::hex, ios::hex);&cout&&"十六进制"&&hex&&n&&&&getchar();}
就是要利用cout.setf()这个了
那就只有不行了。
相关知识等待您来回答
编程领域专家

我要回帖

更多关于 left field 的文章

 

随机推荐