C++中标准输入流对象cin的用法

#cin简介:

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。

此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

#cin常用功能:

常用于读取数据的函数有cin.get()和cin.getline()函数;

有时程序需要用户输入城市名如New York,San Fro等,希望程序读取并存储完整的城市名,而不仅仅是New和San;

这时引进istream中的类(如cin)的一些面向行的类成员函数:getline()和get(),这两个函数都读取一行输入,直到遇到换行符(或者说读取到行尾) 

一句话总结:

这两个函数唯一的区别是:getline()将丢弃换行符,get()将换行符保留在输入序列中 

下面我分别用程序说明这两个函数的区别:

getline()函数:

int main()
{
	const int arsize=20;
	char name[arsize];
	char dessert[arsize];
	cout<<"Enter your name:"<<endl;
	cin.getline(name,arsize);	//第一个参数:存储输入行的数组的名称,第二个参数:要读取的字符数,如果这个参数为20,则函数最多读取19个字符,1个放'\0' 
								//该函数会在读取指定数目的字符或换行符时停止读取  
	cout<<"Enter your favorite dessert:"<<endl;
	cin.getline(dessert,arsize);
	// 拼接cin.getline(name,arsize).getline(dessert,arsize);
	cout<<name<<endl;
	cout<<dessert<<endl; 
	return 0;
}
int main()
{
	cout << "Enter the year:" << endl;
	int year;
	cin >> year;//此时输完year后的换行符仍然留在输入队列中 
	cout << "Enter your address:" << endl;
	char address[80];
	cin.getline(address,80);	//getline()函数看到了换行符后,会认为是一个空行,并将空字符赋给address数组。
								//解决方法有四种,在cin>>year之后,getline()之前补充cin.get()读取换行符,或补充cin.get(ch) 或(cin>>year).get()或(cin>>year).get(ch); 
	cout << year << endl;
	cout << address << endl;
	return 0;
 } 

get()函数:

int main()
{
	const int arsize=20;
	char name[arsize];
	char dessert[arsize];
	cout << "Enter your name:" << endl;
	cin.get(name,arsize);	//如果是这样的话,由于get()函数读取字符到行尾的时候,是不会丢弃换行符的,所以在第一次调用get()函数的时候,换行符仍然保留在输入队列中 
	cout << "Enter your favorite dessert:" << endl;
	cin.get(dessert,arsize);	//此时在第二次调用get()函数的时候,读取的第一个字符便是换行符了,此时get()函数认为已经到结尾,而没有发现任何可读取的内容 
								//解决办法一是在这两个get()函数之间再调用一次不带参数的get()函数来读取换行符,与下面给出的程序一样 
	cout << name << endl;
	cout << dessert << endl;
	return 0;
}
int main()
{
	const int arsize=20;
	char name[arsize];
	char dessert[arsize];
	cout << "Enter your name:" << endl;
	cin.get(name,arsize).get(); //之所以可以这么做,是因为get()函数返回的是一个cin的对象,此对象随后被用来调用get()类成员函数  
	cout << "Enter your favorite dessert:" << endl; //类似的也可以拼接两个getline()函数,与分开调用效果一样 
	cin.get(dessert,arsize).get();
	cout << name << endl;
	cout << dessert << endl;
	return 0;
}





猜你喜欢

转载自blog.csdn.net/dyd850804/article/details/80767311