第七周 输入输出和模板
1.输入输出流相关的类
2.用流操纵算子控制输出格式
3.文件读写(一)
4.文件读写(二)
5.函数模板
6.类模板
7.类模板与派生、友元和静态成员变量
2.用流操纵算子控制输出格式
流操纵算子
控制输出的格式
使用流操纵算子需要 #include
控制整数进制的流操纵算子
流操纵算子dec,oct,hex,setbase分别设置为十进制、十进制、十六机制、任意进制的输出
int n = 10;
cout << n << endl;
cout << hex << n << “\n”
<< dec << n << “\n”
<< oct << n << endl;
输出结果:
10
a
10
12
控制浮点数精度的流操纵算子(precision,setprecision)
precision是ostream类的成员函数,其调用方式为:cout.precision(5);
setprecision 是流操作算子,其调用方式为:cout << setprecision(5); // 连续起作用,后面输出都是这个精度
它们的功能相同。浮点数输出最多6位有效数字。他们都可以在以下两种情况下使用:
(1)指定输出浮点数的有效位数(非定点方式输出时),是这个数的有效数字。
(2)指定输出浮点数的小数点后的有效位数(定点方式输出时),是小数点后的有效数字,这时候不足就补零,超过就四舍五入。
其中,定点方式:小数点必须出现在个位数右边,小数点位置固定。
非定点方式:小数点并不一定在个位数右边,小数点位置不固定,可以是科学计数法1.23457e+006。
缺省的情况下默认是非定点方式。
例子1:缺省默认非定点方式,小数点位置不固定
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double x = 1234567.89,y = 12.34567;
int n = 1234567;
int m = 12;
cout << setprecision(6) << x << endl //缺省的情况下默认是非定点方式
<< y << endl << n << endl << m;
}
输出:
1.23457e+006 //非定点方式,6位有效数字
12.3457
1234567
12
例子2:定点方式,指定精度,小数点位置固定
setiosflags(ios::fixed)或者fixed
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double x = 1234567.89,y = 12.34567;
int n = 1234567;
int m = 12;
cout << setiosflags(ios::fixed) << //以小数点位置固定的方式输出,也可以直接就用cout<<fixed<<…
setprecision(6) << x << endl
<< y << endl << n << endl << m;
}
输出:
1234567.890000
12.345670
1234567
12
例子3:定点方式,指定精度,小数点位置固定,随后取消小数点固定,还原成非定点方式
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double x = 1234567.89;
cout << setiosflags(ios::fixed) <<
setprecision(6) << x << endl <<
resetiosflags(ios::fixed) << x ; //取消以小数点位置固定的方式输出
}
输出:
1234567.890000
1.23457e+006
设置域宽的流操纵算子(setw,width)
设置域宽(setw,width),两者功能相同,width是成员函数,setw是流操作算子,调用方式不同:
cin >> setw(4); 或者 cin.width(5);
cout << setw(4); 或者 cout.width(5);
宽度设置有效性是一次性的,在每次读入和输出之前都要设置宽度。
例子:
int w = 4;
char string[10];
cin.width(5);//包含了结尾的'\0'
while(cin >> string){
cout.width(w++);
cout << string << endl;
cin.width(5);//宽度设置有效性是一次性的,在每次读入和输出之前都要设置宽度。
}
输入:
1234567890
输出:
1234
5678(前面有个空格,因为这时输出宽度是5,cin进来的宽度是4,就在前面补个空格)
90(前面有4个空格,因为这时输出宽度是6,cin进来的宽度是2,就在前面补4个空格)
综合例子:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n = 141;
//1) 分别以十六进制、十进制、八进制先后输出 n
cout << "1) " << hex << n << " " << dec << n << " " << oct << n << endl;
double x = 1234567.89,y = 12.34567;
//2) 保留5位有效数字
cout << "2) " << setprecision(5) << x << " " << y << " " << endl;
//3) 保留小数点后面5位
cout << "3) " << fixed << setprecision(5) << x << " " << y << endl ;
//4) 科学计数法输出,且保留小数点后面5位
cout << "4) " << scientific << setprecision(5) <<x << " " << y << endl ;
//5) 非负数要显示正号,输出宽度为12字符,宽度不足则用'*'填补
cout << "5) " << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
//6) 非负数不显示正号,输出宽度为12字符,宽度不足则右边用填充字符填充
cout << "6) " << noshowpos << setw(12) << left << 12.1 << endl;
//7) 输出宽度为12字符,宽度不足则左边用填充字符填充
cout << "7) " << setw(12) << right << 12.1 << endl;
//8) 宽度不足时,负号和数值分列左右,中间用填充字符填充
cout << "8) " << setw(12) << internal << -12.1 << endl;
cout << "9) " << 12.1 << endl;
return 0;
}
输出:
1) 8d 141 215
2) 1.2346e+006 12.346
3) 1234567.89000 12.34567
4) 1.23457e+006 1.23457e+001
5) ***+12.10000
6) 12.10000****
7) ****12.10000
8) -***12.10000
9) 12.10000
其他常用算子:
fixed:等价于 setiosflags(ios::fixed),设置为定点方式
scientific:设置一定要用科学计数法输出
showpos:非负数要显示正号
noshowpos :非负数不显示正号
setfill(‘字符’):搭配setw(n)使用,宽度不足则用’*'填补
left :左对齐,搭配setw(n)使用,宽度不足则右边用setfill(‘字符’)填充字符填充
right:右对齐,搭配setw(n)使用,宽度不足则左边用setfill(‘字符’)填充字符填充
internal :宽度不足时,负号和数值分列左右,搭配setw(n)中间用填充字符填充
以上都是设置一次后,后面都其作用,直到取消,只有setw(n)是一次性的每次输出都要设置。
用户自定义的流操纵算子
其实就是一种函数,返回值和参数都是ostream的引用,
ostream &tab(ostream &output){
return output << '\t';
}
cout << “aa” << tab << “bb” << endl;
输出:aa bb(中间是个制表符'\t')
为什么可以?
因为 iostream 里对 << 进行了重载(成员函数)ostream & operator<<( ostream & ( * p ) ( ostream & ) ) ;
该函数内部会调用p所指向的函数,且以 *this 作为参数。
hex 、dec 、oct 都是函数。