在标准输入流与输出流中使用控制符笔记


控制符  作用
 dec  设置数值的基数为10
 hex  设置数值的基数为16
 cot  设置数值的基数为8
 setfill(c)  设置填充字符c,c可以是字符常量,也可以是字符变量
 setprecision(n)  设置浮点数的精度为n位。在以一般的十进制小数形式输出时,n代表有效数字。在以fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位数。
 setw(n)   设置字段宽度为n位
 setiosflags(ios::fixed)   设置浮点数以固定小数位数显示
 setiosflags(ios::scientific)  设置浮点数以科学计数法(即指数)显示
 setiosfags(ios::left)  数据左对齐
 setiosflags(ios::right)  数据右对齐
 setiosflags(ios::skipws)   忽略前导的空格
 setiosflags(ios::uppercase)  数据以十六进制输出时字母以大写表示
 setiosflags(ios::lowercase)   数据以十六进制输出时字母以小写表示
 setiosflags(ios::showpos)   输出正数时给出加号
 注意:C++程序设计(第三版)上面的表格中提到过setiosflags(ios::lowercase),但是编译器里面是没有这个控制符的,在编译器里面是用不了这个控制符的。

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a,f;
double b,c,d,e;
a=62;
cout<<dec<<a<<endl; //数据a以10进制输出
cout<<hex<<a<<endl; //数据a以16进制输出
cout<<oct<<a<<endl; //数据a以8进制输出
cout<<dec<<setw(10)<<a<<endl;
cout<<dec<<setfill('*')<<setw(10)<<a<<endl<<endl; //以10进制并按照10位字段宽度输出数据a,填充字符为*
//setfill(c)与setw(n)必须与一同出现,而sew(n)可以独自出现,默认的填充字符为空 //用setfill(c)设置填充字符时应该用 ''符号括起字符变量


b=12345.678;
setprecision(6); //设置浮点数精度为6
cout<<dec; //设置以十进制数输出
cout<<b<<endl; //在以一般的十进制小数输出时,n代表有效数字,并且遵循四舍五入
cout<<setiosflags(ios::fixed)<<b<<endl; //在以fixed(固定小数位)形式时,n为小数位
cout<<setiosflags(ios::scientific)<<b<<endl<<endl; //在以scientific(指数)形式输出时,n为小数位

c=620.620;
d=987.6;
e=789.9666;
cout<<setiosflags(ios::left); //输出数据的左对齐
cout<<c<<endl;
cout<<d<<endl;
cout<<e<<endl<<endl;

cout<<setiosflags(ios::right)<<setfill(' '); //输出数据的右对齐,要达到输出数据的右对齐必须用到setw(n)控制符来设置字段宽度
cout<<setw(10)<<c<<endl; //由于前面有涉及到用控制符setfill(n)将填充字符设置成了*,这里讲设置符重新设置成了空格
cout<<setw(10)<<d<<endl; //设置具有延续性,一旦前面设置了输出的格式,在没有语句改变的情况下,系统会自动按照前面的输出格式输出数据
cout<<setw(10)<<e<<endl<<endl;

f=6206;
cout<<hex<<setiosflags(ios::uppercase)<<f<<endl; //数据以16进制输出时字母以大写表示
cout<<hex<<resetiosflags(ios::uppercase)<<f<<endl; //关闭了以上的格式,恢复成默认的格式
cout<<dec<<setiosflags(ios::showpos)<<f<<endl<<endl; //输出正数时给出'+'号
return 0;
}

运行结果:
0 在标准输入流与输出流中使用控制符笔记_第1张图片
注意:①.上面的源代码中并没有setiosflags(ios::skipws)的举例。
            ②.在上面程序运行时出现了误差,控制符setiosflags(ios::scientific)控制b输出的理论值应该是1.234568e+004,但是输出的值是12345.7,后面有用另外一个编译器编译(编译此代码的编译器分别是dev c++,visual c++6.0),得到的结果仍然与此图相同,然后另外单独写了源代码尝试这组数据,而得到的结果与理论符合,不理解存在这种误差的原因。
注意点:
  1.关闭格式控制符的方法是在在格式控制符前面加re即可。例如:cout<<setiosflags(ios::fixed)<<a<<endl;关闭的语句为:cout<<resetiosflags(ios::fixed)<<a<<endl;
  2.假如要使用控制符,要在程序单位的开头额外加上iomanip头文件;

关于setiosflags(ios::skipws)控制符:
  这里需要说明的是setiosflags(ios::skipws)是一个输入控制符,而不是一个输出控制符,cin是默认把skipws开启的。
代码:
(开启情况,也是默认情况)

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{ char s1,s2,s3;
cin>>setiosflags(ios::skipws);
cin>>s1>>s2>>s3;
cout<<s1<<s2<<s3<<endl;
return 0;
}

运行结果:
在标准输入流与输出流中使用控制符笔记_第2张图片
 关闭情况:

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{ char s1,s2,s3;
cin>>resetiosflags(ios::skipws);
cin>>s1>>s2>>s3;
cout<<s1<<s2<<s3<<endl;
return 0;
}

运行结果:
在标准输入流与输出流中使用控制符笔记_第3张图片
分析:skipws的意思是吃掉空格,在第一种情况也就是默认情况,当你连续地输入多个数据时,由于有skipws的存在,你所按下的空格会被系统自动地过滤,此时的情况就是a='1',b='2',c='3';在第二种情况,由于没有了skipws吃掉空格,所以你所输入的空格也会被赋给变量,所以第二种情况是a='1',b=' ',c='2'(b等于空格),所以才出现图中所存在的情况。

使各行小数点对其的方法:
原理:利用setw(n)、setiosflags(ios::fixed)与setiosflags(ios::ringht)实现输出数据的右对齐和输出数据小数点位数一致,从而达到目的。
源代码:

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
double a,b,c;
a=1234.567;
b=620.62062;
c=987.96;
cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2);
cout<<setw(10)<<a<<endl;
cout<<setw(10)<<b<<endl;
cout<<setw(10)<<c<<endl;
return 0;
}

运行结果:
在标准输入流与输出流中使用控制符笔记_第4张图片
 
 

 

你可能感兴趣的:(在标准输入流与输出流中使用控制符笔记)