代码编译运行环境 QT creator
1.cin和cout简介
cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。
cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。
有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件iostream包含到本文件中,并使用命名空间std:
#include<iostream>
using namespace std;
根据C++的语法,凡是能实现某种操作而且最后以分号结束的都是语句。
2.cin和cout的基本操作
cout语句的一般格式为:
cout<<表达式1<<表达式2<<表达式3...<<表达式n;
cin语句的一般格式为:
cin>>变量1>>变量2>>变量3>>.....>>变量n;
cout:在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或’\n’,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。
一个cout语句可以分成若干行。如:
1)cout<<"this is a simple c++."<<endl;
2)cout<<"this is" //注意没有分号
<<"a C++"
<<"program."
<<endl;
3)cout<<"this is "; //有分号
cout<<"a C++";
cout<<"program.";
cout<<endl;
输出结果差不多。
不能用一个插入运算符“<<”插入多个输出项:
cout<<a,b,c; //错误,不能一次插入多项
cout<<a+b+c; //正确,这是一个表达式,作为一项
在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b为float型,c为char型,则:cout<<a<<' '<<b<<' '<<c<<endl;
输出结果为:4 3.14 a
cin:与cout类似,cin语句可以分成若干行
1)cin>>a>>b>>c>>d;
2)cin>>a //这样的写法比较清晰
>>b
>>c
>>d;
3)cin>>a;
cin>>b;
cin>>c;
从键盘输入的结果都一样:1 enter键 23 enter键 4
在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有:
char c1,c2;
int a;
float b; cin>>c1>>c2>>a>>b;
不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,他们将被跳过。
3.cin的常用读取方法
使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,cin.getline。
3.1cin>>的用法
cin可以连续从键盘读取想要的数据,以空格、enter或换行作为分隔符。
#include <iostream>
usingnamespacestd;
int main()
{
char a;
int b;
float c;
string
cin>>a>>b>>c;
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
system("pause");
return0;
}
在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果:
注意:
(1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。
(2)当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。
(3)不想略过空白字符,那就使用 noskipws 流控制。比如cin>>noskipws>>input;
#include <string>
#include <iostream>
using namespace std;int main()
{char a;int b;float c;string str;cin>>a>>b>>c>>str;cout<<a<<" "<<b<<" "<<c<<" "<<str<<endl;string test;getline(cin,test);//不阻塞cout<<"test:"<<test<<endl;system("pause");return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
从键盘输入:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车],输出结果是:
从结果可以看出,cin>>对缓冲区中的第一个换行符视而不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。但是,getline()读取数据时,并非像cin>>那样忽略第一个换行符,getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符’\0’,因此程序中的test为空串。