众所周知,在C++编程第一课 中,我们接触到了两个神奇的语句:
cin
cout
然而亲爱的曲神告诉我说,
和
太慢了
推荐使用
和
高中时期的我立刻吃了曲神的安利,并幻想着可以把这种陋习带到大学
大学的第一节课,老师指定我们用
编程
于是。。。我凌乱了
所以今天,我们就来深入剖析一下C++的标准输入/输出流:
&&
竞赛的时候,我们更注重时间和效率,
于是输入输出就会偏爱于迅速的
和
然而实际上,
和
才是C++的原配
比起
和
,ta们更加稳定,兼容性也更高
想要使用 ,首先就需要调用专属头文件
#include<iostream>
然而头文件 中实际上包含四个与输入输出有关的对象
cin:标准输入流
cout:标准输出流
cerr:非缓冲标准错误流
clog:经缓冲标准错误流
等等!这个cerr和clog是什么???
和
都是标准错误流,其区别是:
不经过缓冲区直接向显示器输出信息;
中的信息存放在缓冲区,缓冲区满后或遇
向显示器输出。
标准输出流,有缓冲,可重定向。
把要输出的数据先放到缓冲区中,然后再从缓冲区到你指定的设备中。当向
流插入一个
,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符
例:求解一元二次方程,若公式出错,用cerr流输出有关信息
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
float a, b, c, disc;
cout << "please input a , b , c :";
cin >> a >> b >> c;
if (a == 0)
{
cerr << "a is equal to zero,error!" << endl;
}
else if ((disc = b*b - 4*a*c) < 0)
{
cerr << "disc = b*b - 4*a*c< 0,error!" <<endl;
}
else
{
cout << "x1=" << (-b + sqrt(disc)) / (2 * a) << endl;
cout << "x2=" << (-b - sqrt(disc)) / (2 * a) << endl;
}
system("pause");
return 0;
}
setw(int); //设置填充的内容(域宽)
setfill(char); //设置填充的字符
setprecision(int); //显示浮点数的数字个数
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
cout<<setw(6)<<setfill('$')<<27<<endl;
system("pause");
return 0;
}
控制输出宽度
#include <iostream>
using namespace std;
int main() {
double values[] = {1.23,35.36,653.7,4358.24};
for (int i=0;i<4;i++) {
cout.width(10);
cout << values[i] <<'\n';
}
system("pause");
return 0;
}
控制对齐方式
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double values[]={1.23,35.36,653.7,4358.24};
char names[4][10]={"Zoot","Jimmy","Al","Stan"};
for (int i=0;i<4;i++) //默认右对齐
//改为左对齐
cout<<setiosflags(ios_base::left)<<setw(6)<<names[i]<<resetiosflags(ios_base::left)<<setw(10)<<values[i]<<endl;
system("pause");
return 0;
}
控制输出精度
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double values[]={1.23,35.36,653.7,4358.24};
char *names[]={"Zoot","Jimmy","Al","Stan"};
cout<<setiosflags(ios_base::scientific);// 小数类型:fixed
for (int i=0;i<4;i++)
cout<<setiosflags(ios_base::left)<<setw(6)<<names[i]<<resetiosflags(ios_base::left)<<setw(10)<<setprecision(1)<<values[i]<<endl;
system("pause");
return 0;
}
进制控制
hex:十六进制
oct:八进制
dec:十进制
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int num;
cin>>hex>>num;
cout<<oct<<num<<endl;
system("pause");
return 0;
}
最后献上一锅大杂烩:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
char *names[]={"Reader","Writer","Thinker","Player","Mengbier"};
double scores[]={12.23,234.1,5.234,4823.19,23.7};
cout<<setw(25)<<setfill('#')<<"Are you ready, kids?"<<endl; //域宽+填充
cout<<setw(25)<<setfill('#')<<"Yes, Captain!"<<endl;
cout<<endl;
cout<<setfill(' '); //改变填充字符
for (int i=0;i<5;i++) { //域宽
cout.width(20);
cout<<scores[i]<<endl;
}
cout<<endl;
for (int i=0;i<5;i++) //对齐方式
cout<<setiosflags(ios_base::left)<<setw(10)<<names[i]<<resetiosflags(ios_base::left)<<setw(10)<<scores[i]<<endl;
cout<<endl;
cout<<setiosflags(ios_base::scientific); //科学计数法控制输出精度
for (int i=0;i<5;i++)
cout<<setiosflags(ios_base::left)<<setw(10)<<names[i]<<resetiosflags(ios_base::left)<<setw(10)<<setprecision(1)<<scores[i]<<endl;
cout<<resetiosflags(ios_base::scientific); //关闭科学计数法
cout<<endl;
cout<<setprecision(4)<<123.123<<endl;
cout<<endl;
cout<<"十进制"<<endl;
for (int i=1;i<=20;i++) cout<<setw(5)<<i;
cout<<endl;
cout<<"八进制"<<endl;
for (int i=1;i<=20;i++) cout<<setw(5)<<oct<<i;
cout<<endl;
cout<<"十六进制"<<endl;
for (int i=1;i<=20;i++) cout<<setw(5)<<hex<<i;
cout<<endl;
system("pause");
return 0;
}