C++的标准输入/输出流(大学后get到的新姿势)

大神详细的总结


众所周知,在C++编程第一课 H e l l o w o r l d “Hello world!” 中,我们接触到了两个神奇的语句:

cin
cout

然而亲爱的曲神告诉我说, c i n cin c o u t cout 太慢了
推荐使用 s c a n f scanf p r i n t f printf
高中时期的我立刻吃了曲神的安利,并幻想着可以把这种陋习带到大学

大学的第一节课,老师指定我们用 c i n , c o u t cin,cout 编程
于是。。。我凌乱了

所以今天,我们就来深入剖析一下C++的标准输入/输出流: c i n cin && c o u t cout


  • cin , cout , cerr , clog

竞赛的时候,我们更注重时间和效率,
于是输入输出就会偏爱于迅速的 s c a n f scanf p r i n t f printf

然而实际上, c i n cin c o u t cout 才是C++的原配
比起 s c a n f scanf p r i n t f printf ,ta们更加稳定,兼容性也更高

想要使用 c i n , c o u t cin,cout ,首先就需要调用专属头文件

#include<iostream>

然而头文件 i o s t r e a m iostream 中实际上包含四个与输入输出有关的对象

cin:标准输入流
cout:标准输出流
cerr:非缓冲标准错误流
clog:经缓冲标准错误流

等等!这个cerr和clog是什么???

c e r r cerr c l o g clog 都是标准错误流,其区别是:
c e r r cerr 不经过缓冲区直接向显示器输出信息;
c l o g clog 中的信息存放在缓冲区,缓冲区满后或遇 e n d l endl 向显示器输出。

c o u t : cout: 标准输出流,有缓冲,可重定向。
把要输出的数据先放到缓冲区中,然后再从缓冲区到你指定的设备中。当向 c o u t cout 流插入一个 e n d l endl ,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符

在这里插入图片描述

例:求解一元二次方程,若公式出错,用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;
}

在这里插入图片描述


  • 格式化I/O,包含头文件iomanip

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;
}

在这里插入图片描述

发布了941 篇原创文章 · 获赞 192 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/wu_tongtong/article/details/102009795