C++基本输入/输出

 1.输入/输出流(I/O流)

在C++中定义了通过输入/输出流(I/O流)的方法进行输入输出操作。在I/O流中,输入操作是通过cin 来实现的,而输出操作是通过cout来实现的。cin 和cout都是在头文件iostream中定义的,所以在程序中首先要包含输入/输出流的头文件,即#include<iostream>。

 cout语句的一般格式为:
    cout<<表达式1<<表达式2<<……<<表达式n;
cin语句的一般格式为:
    cin>>变量1>>变量2>>……>>变量n;

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或'\n',ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。

一个cout语句可以分写成若干行。如
   cout<<"a+b=c"<<endl;
可以写成
   cout<<"a+b= "  //注意行末尾无分号
   <<"c "
   <<endl; //语句最后有分号
均输出:a+b=c
注意 不能用一个插入运算符“<<”插入多个输出项,如:
    cout<<a,b,c; //错误,不能一次插入多项
    cout<<a+b+c; //正确,这是一个表达式,作为一项
在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b为float型,c为char型,则
    cout<<a<<' '<<b<<' '<<c<<endl;
会以下面的形式输出:
4 345.789 a
与cout类似,一个cin语句可以分写成若干行。如
    cin>>a>>b>>c>>d;
可以写成
   cin>>a //注意行末尾无分号
   >>b //这样写可能看起来清晰些
   >>c
   >>d;
均可以从键盘输入: 1  2  3  4 ↙

在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有
   char c1,c2;
   int a;
   float b;
   cin>>c1>>c2>>a>>b;
注意: 不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符或回车换行符(或任何其他键盘上的字符)输入给字符变量,可以用getchar函数。
在组织输入流数据时,要仔细分析cin语句中变量的类型,按照相应的格式输入,否则容易出错。

关于endl的用法

在c++中,终端输出换行时,用cout<<......<<endl与 “\n”都可以,这是初级的认识。但二者有小小的区别,用endl时会刷新缓冲区,使得栈中的东西刷新一次,但用“\n”不会刷新,它只会换行,栈内数据没有变化。

cout << endl;除了往输出流中插入一个'\n',还有刷新输出流的作用。

cout <<endl; 等价于: cout<< '\n' << flush;

2. 在输入流与输出流中使用控制符

I/O流的常用控制符

  需要注意的是:如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。

以下通过例子进行说明:

【实例一】

#include<iostream>
using namespace std;
#include<iomanip>
int main() {
    int i, j;
    cout << "please input two numbers:";
    cin >> i >> j;
    cout << i << j<<endl;
    cout << setw(10) << i << setw(10) << j << endl;
    
    system("pause");
     return 0;
}

 在该例中,第一个cout没有指定的宽度,而第二个cout中由于setw(10)指明i和j输出时占用字符的宽度为10,前面有8个空格。

如果将例子中cout << setw(10) << i << setw(10) << j << endl;改为如下

cout <<setfill('*')<< setw(10) << i << setw(10) << j << endl;

其输出结果为如图

【实例二】

include<iostream>
#include<iomanip>
using namespace std;

int main() {
    const double  pi = 3.14159;
    double r = 6.779, c, s;
    c = 2.0*pi*r;//计算周长
    s = pi * r*r;//计算面积
    cout << "r的值" << r << endl;
    
    cout << "圆的周长(指数形式)" << setiosflags(ios::scientific) << c << endl;
    cout << "圆的面积(指数形式)" <<s<< endl;
    cout << "圆的周长(小数形式)" << dec << setiosflags(ios::fixed) << c << endl;
    cout << "圆的面积(小数形式)" << dec << setiosflags(ios::fixed) << s << endl;
    
    system("pause");
     return 0;
}

【实例三】

#include <iostream>
#include <iomanip> 
using namespace std;

void testdouble()
{
    double d1 = 12.345678901234567;
    cout << d1 << endl;
}

int main()
{
    cout << "123456的十进制位:" << dec << 123456 << ",八进制为:" << oct << 123456 << ",十六进制为:" << hex << 123456 << 'n' << endl;
    //dec:返回数值的十进制,oct返回是指的八进制,hex返回数值的十六进制。
    cout << dec; //恢复为十进制格式
    cout << setfill('*') << setw(10) << setiosflags(ios::left) << 123456 << 'n' << endl; //setfill(c):设置字符填充,c可以是字符常或字符变量,只对本行有用。
    // setw(n):设置字段宽度为n位,如果n小于所要返回的字符的宽度则保留字符原样输出,只对
    //setiosflags(ios::left):左对齐,setiosflags(ios::right):右对齐

    cout << resetiosflags(ios::left); //终止已设置的输入输出流格式,本例去掉左对齐方式

    double d = 12.345678901234567;

    testdouble(); //之前没有使用输入输出流控制符,d1默认格式输出(精度为6)
    cout << setprecision(16) << d << endl; //设置浮点数的精度,n为有效数字,采用四则五入法舍位,setprecision(n)中,n小于等于16有效。
    testdouble(); //之前使用了setprecision(),此函数保留前面的宽度设置。

    cout << setiosflags(ios::fixed) << setprecision(17) << d << endl;
    //setiosflags(ios::fixed):设置浮点数以固定的小数位数显示,8为8位小数,所指定的小数位如果大于小数本身小数位则补0。

    cout << resetiosflags(ios::fixed);

    cout << setiosflags(ios::scientific) << setiosflags(ios::uppercase) << setprecision(4) << d << 'n' << endl;
    // setiosflags(ios::scietific):用科学计数法表示,4为指定小数位分为四位,且第四位四舍五入。
    //setiosflags(ios::uppercase) : 在以科学计数法输出E与十六进制输出X以大写输出,否则小写。
    system("pause");
    return 0;
}

 3. 六个输入函数用法

学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VS2017运行)

1.       cin

2.       cin.get()

3.       cin.getline()

4.       getline()

5.       gets()

6.       getchar()

3.1  cin>>   

 不做过多的说明,在文章开始已经有相关的解说。

3.2cin.get()

用法1: cin.get(字符变量名)可以用来接收字符

#include <iostream>
using namespace std;
int main()

{

    char a;

    a = cin.get();               //或者cin.get(ch);

    cout << a << endl;

    system("pause");
    return 0;
}

用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

#include <iostream>
using namespace std;
int main()

{

    char a[10];

    cin.get(a,20);               //或者cin.get(ch);

    cout << a << endl;

    system("pause");
    return 0;
}

 用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足

#include <iostream>
using namespace std;
int main()

{

    char a;

    cin.get();               //或者cin.get(ch);
    cin >> a;
    cout << a << endl;

    system("pause");
    return 0;
}

3.3  cin.getline() 

接受一个字符串,可以接收空格并输出

#include <iostream>
using namespace std;
int main()

{
    char m[20];

    cin.getline(m, 5);

    cout << m << endl;


    

    system("pause");
    return 0;
}

接受5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;

当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:

#include <iostream>
using namespace std;
int main()

{
    char m[3][20];

    for (int i = 0; i < 3; i++)

    {

        cout << "\n请输入第" << i + 1 << "个字符串:" << endl;

        cin.getline(m[i], 20);

    }

    cout << endl;

    for (int j = 0; j < 3; j++)

        cout << "输出m[" << j << "]的值:" << m[j] << endl;
    system("pause");
    return 0;
}

3.4  getline()

接受一个字符串,可以接收空格并输出,需包含“#include<string>”

 

#include <iostream>
#include
<string> using namespace std; int main() { string str; getline(cin, str); cout << str << endl; system("pause"); return 0; }

 和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数

3.5  gets()

在VS新标准中,应该是用gets_s代替gets

 接受一个字符串,可以接收空格并输出,需包含“#include<string>”

#include <iostream>
#include<string>
using namespace std;
int main()

{
    char m[20];

    gets_s(m);                      //不能写成m=gets_s();

    cout << m << endl;


    
    system("pause");
    return 0;
}

类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面:

#include <iostream>
#include<string>
using namespace std;
int main()

{
    char m[3][20];

    for (int i = 0; i < 3; i++)

    {

        cout << "\n请输入第" << i + 1 << "个字符串:" << endl;

        gets_s(m[i]);

    }

    cout << endl;

    for (int j = 0; j < 3; j++)

        cout << "输出m[" << j << "]的值:" << m[j] << endl;
      system("pause");
    return 0;
}

自我感觉gets()和cin.getline()的用法很类似,只不过cin.getline()多一个参数罢了;cin.getline()和gets()均可以接收空格

 3.6  getchar()  

接受一个字符,需包含“#include<string>”

#include <iostream>
#include<string>
using namespace std;
int main()

{
    char ch;

    ch = getchar();                       //不能写成getchar(ch);

    cout << ch << endl;
   system("pause");
    return 0;
}

getchar()是C语言的函数,C++也可以兼容,但是尽量不用或少用;

 

posted @ 2020-10-05 21:20  重雪  阅读(822)  评论(0编辑  收藏  举报