参考文章
该系列文章非原创,是本人在学习C++时整理他人博客的学习笔记,旨在将知识点做系统性整理。参考博客如下列出:
C++ cin 详解之终极无惑
小甲鱼系列视频
1.基本概念
- cin 是 C++ 标准输入流对象,即 istream 类的对象。cin 主要用于从标准输入读取数据,这里的标准输入指终端键盘。
- cout 是标准输出流对象,即 ostream 类的对象。
- 标准输入缓冲区。程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符(\n),这个换行符也会被存储在 cin 的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了 123456 这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是 7 ,而不是 6(回车键\r也占用一个字符)。
- cin 读取数据也是从缓冲区中获取数据,缓冲区为空时,cin 的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发 cin 的成员函数去读取数据。
2.cin方法
2.1 cin >> i
- cin >> i,提取操作符,从输入流对象cin提取一个整数。可以自动过滤空格和回车,也可以提取int,float,double型数据,包括字符串等数据。
- 在while(cin >> i)中,表达式cin >> i返回输入流对象本身,也就是cin。但是,如果到达了文件尾或提取到的操作符遇到非法值(比如将浮点数读取到int类型变量中),返回值为false(0)。
#include <iostream>
using namespace std;
int main()
{
int n,sum =0;
while(cin >> n)
{
sum = sum + n;
if ( getchar() == '\n' )
{
break;
}
}
cout << "sum=" << sum << endl;
}
此时输入3.14,会返回3,因为i为int类型变量,只能接收到3,当读到“.”时,会false,跳出循环。
2.2 cin.ignore() & cin.getline()
- getline():从标准输入设备键盘读取一串字符串,并以指定的结束符结束。
- ignore():跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。
#include <iostream>
using namespace std;
int main(){
char buf[20];
cin.ignore(7);
cin.getline( buf , 10 );
cout << buf << endl;
}
这里“ !”消失是因为字符串默认最后一位以0结尾。
2.3 cin.get() & cin.peek()
- get():读取一个字符,可以使用 cin.get() 或者 cin.get(var)。
#include <iostream>
using namespace std;
int main() {
char a;
char b;
a=cin.get();
cin.get(b);
cout << a << b <<endl;
return 0;
}
输入:[空格][空格][空格][空格]asd,输出:[空格][空格]
输入:asdasd,输出:as
从结果可以看出,cin.get() 从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取,就出现了如上情况,将空格读入变量 。换行符同样不忽略。
- peek():其功能是从输入流中读取一个字符 但该字符并未从输入流中删除。get相当于栈的成员函数pop,peek函数就相当于栈的成员函数front。
#include <iostream>
using namespace std;
int main() {
char p;
cout << "请输入一段文本:\n";
while( cin.peek() != '\n'){
cout << ( p = cin.get() );
}
cout << endl;
return 0;
}
2.4 cin.read() & cin.write()
- read():读取指定数量的数组字符。
- write():写入指定数量的数组字符。
#include <iostream>
using namespace std;
int main() {
const int SIZE = 50;
char buf[SIZE]; //开辟一段缓冲区,且没有初始化
char a;
cout << "请输入一段文本:";
cin.read( buf , 20 ); //读取输入的前20个字符到缓冲区
cout << "字符串收集到的字符数:"
<< cin.gcount() << endl;
cout << "输入文本信息是:";
cout.write( buf , 30 ); //输出缓冲区前30个字符,前20个正常,后10个由于没有初始化会乱
cout << endl;
return 0;
}