在学习C++这么久以来,虽然一直使用着输入输出流,但是对它们却并没有进行系统的了解和学习。在最近,将它们的一些基本用法进行了一次简单的归纳。
使用ios类的成员函数进行格式控制
格式状态字
C++可以对流对象的输入输出进行格式控制,以此来完成各种各样的格式需求。在ios的public部分定义了一个枚举,它的每个成员都是一个状态标志位:
1)skipws (默认设置)
从一个流中输入时,将跳过开头的空白字符(空格,制表符,换行符)。
2)left、right、internal (默认 right)
left:输出左对齐,域宽的其余部分用填充符填充;
right:同left相反;
internal:数值的符号左对齐,数值本身右对齐,之间为填充符。
3)dec、oct、hex (默认 dec)
十进制、八进制、十六进制。
4)showbase (默认不设置)
基指示符,若同时设置hex,则数据会加上前缀 “0x”。
5)showpoint (默认不设置)
强制显示浮点型数据小数点后的无效0。
6)uppercase (默认不设置)
字母大写显示。
7)showpos (默认不设置)
显示正数时,前面加“+”进行强调。
8)scientific、fixed(编译程序会根据情况选择)
scientific:浮点数用科学记数法输出;
fixed:浮点数按常规显示。
接下来两个格式状态字与缓冲区有关
9)unitbuf
输出后立即刷新所有流,即把输出流写到与流相连的物理设备上。
10)stdio
每次输出后,刷新stdout和stderr。
stdout:输出方式为行缓冲;
stderr:不带缓冲。
用于控制输入输出格式的成员函数
函数名 | 作用 |
---|---|
long ios::flags( ) | 返回当前格式状态字 |
long ios::flags(long) | 设置格式状态字并返回 |
long ios::setf(long) | 追加指定的格式状态字 |
long ios::unsetf(long) | 清除指定的格式状态字 |
int ios::width() | 返回当前显示数据的域宽 |
int ios::width(int) | 设置域宽并返回原域宽 |
char ios::fill() | 返回当前填充字符 |
char ios::fill(char) | 设置填充字符并返回原填充字符 |
int ios::precision() | 返回当前浮点数的精度 |
int ios::precision() | 设置浮点数精度并返回原精度 |
格式状态字
long f;
int a = 10;
double b = 100.00;
f = cout.flags();
cout << "The flags's result is " << f << endl;
cout << "a = " << a << "\t b = " << b << endl;
cout.setf(ios::showpoint);
cout << "b = " << b << endl;
cout.unsetf(ios::showpoint | ios::dec);
cout.setf(ios::hex | ios::showbase);
cout << "十六进制:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout.setf(ios::scientific);
cout << "科学计数法:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout.setf(ios::uppercase);
cout << "字母大写:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
vs2017运行,控制台输出结果:
①在使用格式状态字设置函数时,可使用“|”进行同时设置;
②进制变换对浮点数无任何作用;
③在进行进制变换时,必须先清除当前进制,再设置新的进制。
填充字符与域宽
int a = 100;
double b = 12.30895;
int length = cout.width();
cout <<"The initial width is "<< length << endl;
cout.width(2);
cout << a << endl;
cout.width(10);
cout.fill('#');
cout << a << endl;
cout << a << endl;
cout << "未调整精度:" << endl;
cout << b << endl;
cout.precision(10);
cout << "调整后:" << endl;
cout.width(10);
cout << b << endl;
cout << b << endl;
cout.setf(ios::showpoint);
cout << "强制显示无效0:" << endl;
cout << b << endl;
vs2017运行,控制台输出结果:
①初始域宽为0,数据按自身长度打印;
②当设置域宽长度小于数据自身长度时,并不会改变数据的输出,
小数点也在域宽中占一个长度;
③当width()设置域宽后,只对之后的第一个输出有影响,而fill()与precision()一直有效;
④默认填充字符为空格,默认有效数字为6位。