cin &&cout

来源:互联网 发布:淘宝店铺的等级怎么看 编辑:程序博客网 时间:2024/04/29 05:22
经常要使用到cin和cout,花了点时间,把常见的问题整理了一下,供记性不好时查阅。在程序中包含iostream文件将自动创建cin对象和cou对象,即标准输入流和标准输出流。关于cout :<<操作符的默认含义是按位左移操作符,但ostream类重新定义了<<操作符,将其重载为输出方法。<<支持C++的所有的基本类型。对于每一种数据类型,C++都提供了operator<<()的定义。例如,如果表达式cout << 100对应于下面的方法:Ostream & operator<<(int);Ostream类还为以下的指针类型定义了插入操作符函数:Const signed char*;Const unsigned char*;Const char*;Void *;Cout 支持拼接输出:如: cout << "hello" <<"world"<<endl;怎样刷新输出缓冲区?由于ostream对cout对象处理的输出进行缓冲,所以输出不会立即发送到目的地址,而是被存储在缓冲区中,直到缓冲区填满。然后,程序将刷新缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据。通常,缓冲区为512字节或其整数倍。有两种方式实现缓冲区的手动刷新:Flush:刷新缓冲区Endl:刷新缓冲区,并插入一个换行符例如:   cout << "hello world" << flush;  Cout << "hello world" <<endl;关于cin:Cin对象将标准输入表示为字节流。输入可以是字符串的一部分、int值、float值等,istreaml类重载了抽取操作符>>,使之能够识别C++所有的基本数据类型,所以,抽取还涉及到类型转换。编译器将根据数据接收者的类型,匹配适当的的函数。例如: cin >> value_holder 如果value_holder为int型,则将匹配函数istream & operator>>(int &); //注意函数原型,参数和返回值都是引用而如果value_holder为char类型,则将匹配函数istream & operator >>(char &);istream类为下列字符指针类型重载了>>抽取操作符:signed char*;char *;unsigned char *;Cin的常见用法:用法1:最基本,也是最常用的用法,输入一个数字:[java] view plaincopyprint?01.#include <iostream>  02. using namespace std;  03. int main () {  04. int a,b;  05. cin>>a>>b;   06. cout<<a+b<<endl;   07. return 0;  08.}  #include <iostream> using namespace std; int main () { int a,b; cin>>a>>b;  cout<<a+b<<endl;  return 0;}注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等) cin>>noskipws>>input[j];//不想略过空白字符,那就使用 noskipws 流控制用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束[java] view plaincopyprint?01.#include <iostream>   02.using namespace std;   03.int main () {   04. char a[20];  05. cin>>a;   06. cout<<a<<endl;  07.return 0  08.}  #include <iostream> using namespace std; int main () {  char a[20]; cin>>a;  cout<<a<<endl;return 0} Cin有一个比较“智能”之处,即它会读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。例如,对于下面的代码:Int value;Cin >> -123a;操作符将提取-,1,2,3,因为它们都是整数的有效部分。但是a字符不是有效字符,因此输入中最后一个可接受的字符是3,a将留在输入流中,下一个cin语句将从这里开始读取。与此同时,操作符将字符序列-123转换为一个整数值,并将它赋给value。怎样实现循环输入?先看这样一段代码:[java] view plaincopyprint?01.int sum =0;  02.int input;  03.While(cin >> input){  04.    Sum += input;  05.}  int sum =0;int input;While(cin >> input){    Sum += input;} 这段代码实现了循环输入,循环体中当然可以用别的数据结构比如容器来接收输入,这不是一个死循环吗?当然,如果一直输入的是正确的int型数据,输入将一直进行下去,直到地老天荒!结束这个循环的方法很简单,输入一个错误字符即可。当cin操作未能读取到预期的字符时,它将设置流状态failbit.,此时,if或者else将断定cin对象为false。怎样恢复流状态?当>>提取到非预期字符时,会设置failbit,此时流会关闭。如果要继续输入,必须要重置流状态,同时还要清空流缓存中遗留的数据。Cin.clear();//重置流状态Cin.sync();//清空流缓存这两个函数要同时使用才算完成重置流状态。以下代码说明sync()函数的功能:[java] view plaincopyprint?01.#include <iostream>  02.using namespace std;  03.  04.int main () {  05.  char first, second;  06.  07.  cout << "Please, enter a word: ";  08.  first=cin.get();  09.  cin.sync();  10.  11.  cout << "Please, enter another word: ";  12.  second=cin.get();  13.  14.  cout << "The first word began by " << first << endl;  15.  cout << "The second word began by " << second << endl;  16.  return 0;  17.}  #include <iostream>using namespace std;int main () {  char first, second;  cout << "Please, enter a word: ";  first=cin.get();  cin.sync();  cout << "Please, enter another word: ";  second=cin.get();  cout << "The first word began by " << first << endl;  cout << "The second word began by " << second << endl;  return 0;}怎样得到整行数据?如果想得到整行数据,cin有诸多限制。这时可以借用非格式化输入函数。istream & getline(char*,int,char);istream & getline(char* ,int);这是istream提供的整行录入函数,但是都需要制定接收字符串的长度,streamstring提供了一个更便捷的getline版本:istream &getline(istream&,string)这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略行开头的换行符。只要getline遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。 getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。例如: [java] view plaincopyprint?01.int main(){  02.string line;  03.while (getline(cin, line))   04.  cout << line << endl;  05.return 0;  06.}   int main(){string line;while (getline(cin, line))   cout << line << endl;return 0;} 由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。 

原创粉丝点击