【C/C++】Cin与Cout-阿里云开发者社区

开发者社区> tengweitw> 正文

【C/C++】Cin与Cout

简介:          为成为国际语言,C++必须能处理需要16位的国际字符集Unicode,于是在传统的8位char型的基础上添加了wchar_t字符类型。
+关注继续查看

         为成为国际语言,C++必须能处理需要16位的国际字符集Unicode,于是在传统的8位char型的基础上添加了wchar_t字符类型。在程序包含iostream文件时,将自动创建8个流对象:cin、cout、cerr、clog以及相对应的用于宽字符流的:wcin、wcout、wcerr、wclog。

                                      Cin

可以将hex oct dec与cin连用,用于指定将输入的整数的进制

   inta;

   cin>>hex>>a;//输入12h

   cout<<a<<endl;//输出18d

当把输入传给字符数组时,会自动在后面加上一个空值字符,使之成为一个字符串。

   char name[10];

   cin>>name;//当输入>=10时,会出错,因为会自动加'\0'

   cout<<name<<endl;


cin检查输入

   int a;

   cin>>a;

   cout<<a<<endl;

   char name[10];

   cin>>name;

   cout<<name<<endl;

当输入123sdf或者123 sdf时,结果是a=123 name=sdf

 

流状态:

由3个ios_base元素组成:eofibtbadbit failbit。

当cin到达文件末尾是,它将设置eofbit

当cin未能读取预期的字符时(如类型不对),它将设置failbit

当cin试图读取不可访问的文件时,可能设置failbit

当有无法诊断的错误时,设置badbit

当全部3个状态都设置为0时,说明一切正常

 

设置状态

clear:

clear();//将使用默认参数0,这将清楚全部3个状态位:eofibt badbit failbit

clear(eofbit);//将状态设置为eofbit,另外两个状态被清除

而setstate()只影响参数对应的位

  setstate(eofbit);//将设置eofbit,不会影响其它位

 

get与getline

get(char&)与get(void)不跳过空白的单字符

get(char*,int,char)与getline(char*,int,char)默认情况下是读取整行而不是一个单词。

get(void)返回的是int型,因为它可能返回EOF=-1,则下面是错误的

cin.get().get()

 

到底采用哪一种输入方式?

  •   如果希望跳过空白,则使用cin>>ch
  •   如果希望程序检查每一个字符,则用cin.get(ch)

get()与getline()的主要区别在于:get()将换行符或则者分界符留在输入流中,这样接下来的输入操作首先看到的将是换行符或者是分界符,而getline()抽取并丢弃输入流中的换行符

 

ignore(int n,char)将读取并丢弃接下来的n个字符或直到到达第一个char。

   int a;

   cin.ignore(5,'3');

   cin>>a;//输入1312

   cout<<a<<endl;//输出12

 

cin.read()与cin.get()不同的是,read()不会在输入之后加’\0’,因此不能将输入转为字符串

cin.peek()用于返回下一个输入的字符,但是并不把这个字符从缓存中读取出来。

Cin.putback()用于将一个字符插入到输入字符串中,即下一个要读取的字符就是你插入的字符。

 


Cout


  • 可以直接输出数组名和字符指针以及字符常量。

#include<iostream>
using namespace std;

void main()
{
	char name[10]="tengwei";
	char *p="xidian university";
	cout<<"hello world!\n";
	cout<<name<<endl;
	cout<<p<<endl;//这里显示的是字符串而不是p的值(即不是字符串的地址)

	cout<<&name<<endl;//数组的首地址
	cout<<&p<<endl;//指针p的地址
	cout<<(void*)p<<endl;//这才是字符串的地址!需进行强制转化
                         //对于其它指针类型,cout认为是void*
}

注意如何输出字符串地址


  • Ostream定义了put()和write()方法,分别用于字符的显示与字符串的显示

cout.put()是用来输出单个字符的 比如cout.put('\n');  cout.put('a');
cout.write(*s,num);是用来输出字符串的。*s是字符串的地址,num是想要输出的字符串的长度,空格也算就算是空字符也算在内。

例如:cout.write(“tengweitw”,4);将输出teng


  • Write()方法也可用于数值数据:

    longval=560031841;

    cout.write((char*)&val,sizeof(int));//结果为aha!

    Val被显示为4个字符的组合,由于val的十六进制为21616861,而61h变为十进制正好是97即a,68h=104d=h,21h=33=!

     

    Cout进行输出时,并不会立刻发送到目的地,而是先存储在缓存区,直到缓存区填满,然后程序刷新缓存区,把内容发出去,并清空缓存区。这样做可以节省大量时间,毕竟不希望每次有数据就立即发送,因为这样要存取硬盘很多次,浪费时间。我们可以调用flush来刷新,如下面都可以:

        cout<<"hello"<<flush;

        flush(cout);

        cout.flush();


  • 进制间转换

    十进制:dec

    八进制: oct

    十六进制: hex

    Dec oct hex 这些控制符不是成员函数。它们的作用是长期的,直达重新设置为止。


    调整字段宽度:

    Int width();//返回当前设置

    Int width(int i);//设置宽度为i

    注意width只影响接下来的一个项目而已,然后恢复默认值

      

    填充字符:

    Cout.Fill(‘*’)// 它们的作用是长期的,直达重新设置为止。

     

    精度设置

    在默认情况下,精度为显示的总位数,在定点模式和科学模式下,精度指的是小数点后面的位数,默认精度为6(末尾0不显示)

    Cout.precision(2); // 它们的作用是长期的,直达重新设置为止。

     

    打印末尾的0和小数点

    cout.setf(ios_base::showpoint);


  • Setf()的用法
    setf()用于控制小数点被显示是的其它几个格式选项。

    Setf()有两个函数原型:

    fmtflags setf (fmtflags fmtfl, fmtflags mask);
    fmtflags setf (fmtflags fmtfl);

    其中fmtfl和mask的可选值如下:

    fmtfl 
    format flag value

    mask 
    field bitmask

    left, right or internal

    adjustfield

    dec, oct or hex

    basefield

    scientific or fixed

    floatfield

    具体可以查看此链接:http://www.cplusplus.com/reference/ios/ios_base/setf/

    具体调用如下:

    #include<iostream>
    
    using namespace std;
    
    void main()
    {
    	
    	cout<<true<<endl;//1
    	cout.setf(ios_base::boolalpha);//输入输出bool值,可以为true或false
    	cout<<true<<endl;//true
    
    	cout.setf(ios_base::showbase);//对于输出,使用C++基数前缀
    	cout<<hex<<63<<endl;//0x3f
    
    	cout.setf(ios_base::showpoint);//显示末尾的小数点
        cout<<dec<<6.3<<endl;//6.30000
    
    	cout.setf(ios_base::uppercase);//对于进制输出,使用大写字母,E表示法
    	cout<<hex<<63<<endl;//0X3F是大写
    
    	cout.setf(ios_base::showpos);//在整数前面加上+
    	cout<<dec<<63<<endl;//+63
    
    /*下面为有两个参数的输入*/
    	cout.unsetf(ios_base::basefield);
    	cout.unsetf(ios_base::adjustfield);
    	cout.unsetf(ios_base::floatfield);
    
    	cout.setf(ios_base::dec,ios_base::basefield);//使用基数,若输入是小数则无效
    	cout<<12.34<<endl;//12.34,输入是小数则无效
    	cout.setf(ios_base::oct,ios_base::basefield);//使用基数,若输入是小数则无效
    	cout<<12<<endl;
    	cout.setf(ios_base::hex,ios_base::basefield);//使用基数,若输入是小数则无效
    	cout<<12<<endl;
    
    	cout.setf(ios_base::fixed,ios_base::floatfield);//使用定点计数法
    	cout<<12.34<<endl;
    	cout.setf(ios_base::scientific,ios_base::floatfield);//使用科学计数法
    	cout<<12.34<<endl;
    
    	cout.unsetf(ios_base::basefield);//消除指定域的设置,恢复默认状态
    	cout.unsetf(ios_base::adjustfield);//消除指定域的设置,恢复默认状态
    	cout.unsetf(ios_base::floatfield);//消除指定域的设置,恢复默认状态
    	cout.unsetf(ios_base::showpoint);//showpoint等个不在上面个域内,应该单独消除
    
    	cout.setf(ios_base::left,ios_base::adjustfield);//左对齐
    	cout.setf(ios_base::right,ios_base::adjustfield);//右对齐
    	cout.setf(ios_base::internal,ios_base::adjustfield);//符号或基数前缀左对齐,值右对齐
    
    }
    

    上面所用的一些函数都可以用下面的标准控制符来调用:

    #include<iostream>
    
    using namespace std;
    
    void main()//与上面的相对应,就不写注释了
    {
    	cout<<boolalpha<<true<<endl;
    //	cout<<noboolapha<<true<<endl;//在我的电脑上noboolapha不支持
    
    	cout<<showbase<<hex<<63<<endl;
    	cout<<noshowbase<<hex<<63<<endl;
    
    	cout<<showpoint<<12.34<<endl;
    	cout<<noshowpoint<<12.34<<endl;
    
    	cout<<showpos<<12.34<<endl;
    	cout<<noshowpos<<12.34<<endl;
    
    	cout<<uppercase<<hex<<63<<endl;
    	cout<<nouppercase<<hex<<63<<endl;
    
    	cout<<internal<<63<<endl;
    	cout<<left<<63<<endl;
    	cout<<right<<63<<endl;
    	cout<<dec<<63<<endl;
    	cout<<hex<<63<<endl;
    	cout<<oct<<63<<endl;
    	cout<<fixed<<12.34<<endl;
    	cout<<scientific<<12.34<<endl;
    
    }
    



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8642 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2840 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2294 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10468 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11942 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4570 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
3739 0
+关注
tengweitw
所在学校:西电 兴趣爱好:编程、英语,象棋,乒乓球 email:771257840@qq.com
159
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载