zoukankan      html  css  js  c++  java
  • cin与cout详解

    输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。

    C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。

    有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:
        #include <iostream>
    尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“<<”实现输出的语句称为输出语句或cout语句。根据C++的语法,凡是能实现某种操作而且最后以分号结束的都是语句。

    一、输入流与输出流的基本操作

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

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

    一个cout语句可以分写成若干行。如
       cout<<"This is a simple C++ program."<<endl;
    可以写成
       cout<<"This is "  //注意行末尾无分号
       <<"a C++ "
       <<"program."
       <<endl; //语句最后有分号
    也可写成多个cout语句,即
       cout<<"This is "; //语句末尾有分号
       cout <<"a C++ ";
       cout <<"program.";
       cout<<endl;
    以上3种情况的输出均为
    This is a simple C++ program.

    注意 不能用一个插入运算符“<<”插入多个输出项,如:
        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;
    也可以写成
       cin>>a;
       cin>>b;
       cin>>c;
       cin>>d;
    以上3种情况均可以从键盘输入: 1  2  3  4 ↙

    也可以分多行输入数据:
       1↙
       2  3↙
       4↙
    在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有
       char c1,c2;
       int a;
       float b;
       cin>>c1>>c2>>a>>b;
    如果输入
    1234 56.78↙

    注意: 34后面应该有空格以便和56.78分隔开。也可以按下面格式输入:
    1 2 34 56.78↙ (在1和2之间有空格)
    不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符或回车换行符(或任何其他键盘上的字符)输入给字符变量,可以用3.4.3节介绍的getchar函数。
    在组织输入流数据时,要仔细分析cin语句中变量的类型,按照相应的格式输入,否则容易出错。

    二、在输入流与输出流中使用控制符

    上面介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。

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

    举例: 输出双精度数。
    double a=123.456789012345;对a赋初值
    (1) cout<<a;输出: 123.456
    (2) cout<<setprecision(9)<<a;输出: 123.456789
    (3) cout<<setprecision(6);恢复默认格式(精度为6)
    (4) cout<< setiosflags(ios∷fixed);输出: 123.456789
    (5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;输出: 123.45678901
    (6) cout<<setiosflags(ios∷scientific)<<a;输出: 1.234568e+02
    (7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; 输出: 1.2346e02

    下面是整数输出的例子:
    int b=123456;对b赋初值
    (1) cout<<b;输出: 123456
    (2) cout<<hex<<b; 输出: 1e240
    (3) cout<<setiosflags(ios∷uppercase)<<b;输出: 1E240
    (4) cout<<setw(10)<<b<<','<<b; 输出:  123456,123456
    (5) cout<<setfill('*')<<setw(10)<<b;输出: **** 123456
    (6) cout<<setiosflags(ios∷showpos)<<b;输出: +123456

    如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

    例3.1 各行小数点对齐。
    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main( )
    {
       double a=123.456,b=3.14159,c=-3214.67;
       cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2);
       cout<<setw(10)<<a<<endl;
       cout<<setw(10)<<b<<endl;
       cout<<setw(10)<<c<<endl;
       return 0;
    }

    输出如下:
      123.46 (字段宽度为10,右对齐,取两位小数)
    3.14
      -3214.67
    先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。

    学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息;
    1、cin
    1、cin.get()
    2、cin.getline()
    3、getline()
    4、gets()
    5、getchar()

    1、cin>>          

    用法1:最基本,也是最常用的用法,输入一个数字:

    #include <iostream>
    using namespace std;
    main ()
    {
    int a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    }

    输入:2[回车]3[回车]
    输出:5

    用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束

    #include <iostream>
    using namespace std;
    main ()
    {
    char a[20];
    cin>>a;
    cout<<a<<endl;
    }

    输入:jkljkljkl
    输出:jkljkljkl

    输入:jkljkl jkljkl       //遇空格结束
    输出:jkljkl

    2、cin.get()

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

    #include <iostream>
    using namespace std;
    main ()
    {
    char ch;
    ch=cin.get();               //或者cin.get(ch);
    cout<<ch<<endl;
    }

    输入:jljkljkl
    输出:j

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

    #include <iostream>
    using namespace std;
    main ()
    {
    char a[20];
    cin.get(a,20);
    cout<<a<<endl;
    }

    输入:jkl jkl jkl
    输出:jkl jkl jkl

    输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
    输出:abcdeabcdeabcdeabcd              (接收19个字符+1个'')

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

    这个我还不知道怎么用,知道的前辈请赐教;

    3、cin.getline()   // 接受一个字符串,可以接收空格并输出

    #include <iostream>
    using namespace std;
    main ()
    {
    char m[20];
    cin.getline(m,5);
    cout<<m<<endl;
    }

    输入:jkljkljkl
    输出:jklj

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

    如果把5改成20:
    输入:jkljkljkl
    输出:jkljkljkl

    输入:jklf fjlsjf fjsdklf
    输出:jklf fjlsjf fjsdklf

    //延伸:
    //cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)
    //当第三个参数省略时,系统默认为''
    //如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk

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

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

    main ()
    {
    char m[3][20];
    for(int i=0;i<3;i++)
    {
    cout<<" 请输入第"<<i+1<<"个字符串:"<<endl;
    cin.getline(m[i],20);
    }

    cout<<endl;
    for(int j=0;j<3;j++)
    cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

    }

    请输入第1个字符串:
    kskr1

    请输入第2个字符串:
    kskr2

    请输入第3个字符串:
    kskr3

    输出m[0]的值:kskr1
    输出m[1]的值:kskr2
    输出m[2]的值:kskr3

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

    #include<iostream>
    #include<string>
    using namespace std;
    main ()
    {
    string str;
    getline(cin,str);
    cout<<str<<endl;
    }

    输入:jkljkljkl
    输出:jkljkljkl

    输入:jkl jfksldfj jklsjfl
    输出:jkl jfksldfj jklsjfl

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

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

    #include<iostream>
    #include<string>
    using namespace std;
    main ()
    {
    char m[20];
    gets(m);                       //不能写成m=gets();
    cout<<m<<endl;
    }

    输入:jkljkljkl
    输出:jkljkljkl

    输入:jkl jkl jkl
    输出:jkl jkl jkl

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

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

    main ()
    {
    char m[3][20];
    for(int i=0;i<3;i++)
    {
    cout<<" 请输入第"<<i+1<<"个字符串:"<<endl;
    gets(m[i]);
    }

    cout<<endl;
    for(int j=0;j<3;j++)
    cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

    }

    请输入第1个字符串:
    kskr1

    请输入第2个字符串:
    kskr2

    请输入第3个字符串:
    kskr3

    输出m[0]的值:kskr1
    输出m[1]的值:kskr2
    输出m[2]的值:kskr3

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

    这里顺带说明一下,对于本文中的这个kskr1,kskr2,kskr3的例子,对于cin>>也可以适用,原因是这里输入的没有空格,如果输入了空格,比如“ks kr jkl[回车]”那么cin就会已经接收到3个字符串,“ks,kr,jkl”;再如“kskr 1[回车]kskr 2[回车]”,那么则接收“kskr,1,kskr”;这不是我们所要的结果!而cin.getline()和gets()因为可以接收空格,所以不会产生这个错误;

    6、getchar()   //接受一个字符,需包含“#include<string>”

    #include<iostream>
    #include<string>
    using namespace std;
    main ()
    {
    char ch;
    ch=getchar();                        //不能写成getchar(ch);
    cout<<ch<<endl;
    }

    输入:jkljkljkl
    输出:j

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

    有什么建议可以一起探讨,我的email是

     
     
  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/jdxn/p/6721988.html
Copyright © 2011-2022 走看看