C++ 之cin与cout常见问题详解

转载 2015年07月10日 09:19:55

经常要使用到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;


怎样刷新输出缓冲区?

由于ostreamcout对象处理的输出进行缓冲,所以输出不会立即发送到目的地址,而是被存储在缓冲区中,直到缓冲区填满。然后,程序将刷新缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据。通常,缓冲区为512字节或其整数倍。

有两种方式实现缓冲区的手动刷新:

Flush:刷新缓冲区

Endl:刷新缓冲区,并插入一个换行符

例如: 

  cout << "hello world" << flush;

  Cout << "hello world" <<endl;


关于cin:

Cin对象将标准输入表示为字节流。输入可以是字符串的一部分、int值、float值等,istreaml类重载了抽取操作符>>,使之能够识别C++所有的基本数据类型,所以,抽取还涉及到类型转换。编译器将根据数据接收者的类型,匹配适当的的函数。

例如: cin >> value_holder 

如果value_holderint型,则将匹配函数

istream & operator>>(int &); //注意函数原型,参数和返回值都是引用

而如果value_holderchar类型,则将匹配函数

istream & operator >>(char &);

istream类为下列字符指针类型重载了>>抽取操作符:

signed char*;

char *;

unsigned char *;

Cin的常见用法:

用法1:最基本,也是最常用的用法,输入一个数字:

[java] view plaincopy
  1. #include <iostream>  
  2.  using namespace std;  
  3.  int main () {  
  4.  int a,b;  
  5.  cin>>a>>b;   
  6.  cout<<a+b<<endl;   
  7.  return 0;  
  8. }  

注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等) 
cin>>noskipws>>input[j];//不想略过空白字符,那就使用 noskipws 流控制

用法2:接受一个字符串,遇空格“TAB”回车都结束

[java] view plaincopy
  1. #include <iostream>   
  2. using namespace std;   
  3. int main () {   
  4.  char a[20];  
  5.  cin>>a;   
  6.  cout<<a<<endl;  
  7. return 0  
  8. }  

Cin有一个比较“智能”之处,即它会读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。

例如,对于下面的代码:

Int value;

Cin >> -123a;

操作符将提取-,1,2,3,因为它们都是整数的有效部分。但是a字符不是有效字符,因此输入中最后一个可接受的字符是3a将留在输入流中,下一个cin语句将从这里开始读取。与此同时,操作符将字符序列-123转换为一个整数值,并将它赋给value


怎样实现循环输入?

先看这样一段代码:

[java] view plaincopy
  1. int sum =0;  
  2. int input;  
  3. While(cin >> input){  
  4.     Sum += input;  
  5. }  

这段代码实现了循环输入,循环体中当然可以用别的数据结构比如容器来接收输入,这不是一个死循环吗?当然,如果一直输入的是正确的int型数据,输入将一直进行下去,直到地老天荒!结束这个循环的方法很简单,输入一个错误字符即可。

cin操作未能读取到预期的字符时,它将设置流状态failbit.,此时,if或者else将断定cin对象为false


怎样恢复流状态?

>>提取到非预期字符时,会设置failbit,此时流会关闭。如果要继续输入,必须要重置流状态,同时还要清空流缓存中遗留的数据。

Cin.clear();//重置流状态

Cin.sync();//清空流缓存

这两个函数要同时使用才算完成重置流状态。

以下代码说明sync()函数的功能:

[java] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main () {  
  5.   char first, second;  
  6.   
  7.   cout << "Please, enter a word: ";  
  8.   first=cin.get();  
  9.   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. }  

怎样得到整行数据?

如果想得到整行数据,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 plaincopy
  1. int main(){  
  2. string line;  
  3. while (getline(cin, line))   
  4.   cout << line << endl;  
  5. return 0;  
  6. }   

由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。 



参考资料:

《C++ primer》

《C++ primer plus》


04-C++-cin与scanf cout与printf效率问题

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的re...
  • l2580258
  • l2580258
  • 2016年05月05日 00:47
  • 1880

C++中cin,cout,以及返回值

转自:http://blog.csdn.net/kongbai308416350/article/details/4470914  今天在看c++primer的时候,读到其中这样一段话: When...
  • ljh0302
  • ljh0302
  • 2015年08月31日 20:58
  • 1699

C++中cin/cout的用法

格式: cin>>变量1>>变量2>>……>>变量n;cin:C++编程语言互换中的标准输入流,需要头文件iostream.hcin代表标准输入设备,使用提取运算符“>>”从设备键盘取得数据,送到输...
  • linjingtu
  • linjingtu
  • 2016年07月03日 11:52
  • 2313

C++中的endl搭配cout和cin用法

endl英语意思是end of line,即一行输出结束,然后输出下一行。 endl与cout搭配使用,意思是输出结束。 按C++标准程序库中的描述其实现如下: template std::...
  • u011555996
  • u011555996
  • 2016年04月16日 16:21
  • 2430

cin和cout的简单实用

从C到C++ 大二开始了,大一学的C,大二开始了C++的课程,首先C语言是结构化和模块化的语言,它是面向过程的,而C++是面向对象的,这就大大的加强了程序员对程序的可利用性和可操作性。 C++保留...
  • shanyongxu
  • shanyongxu
  • 2014年09月26日 13:26
  • 703

C++中 cin 与 cout 的用法

整数的基数:dec(十进制) ,   oct(八进制),    hex(十六进制)  。 具体实现见代码: /*******************************************...
  • zhang_xueping
  • zhang_xueping
  • 2015年08月22日 22:36
  • 1136

cin/printf 重定向

本地调试 C++ cin重定向
  • chuchus
  • chuchus
  • 2014年03月11日 22:21
  • 1605

C++ cin\cout关闭同步

首先说明:不关闭同步的话scanf与printf明显更快一些。关闭同步cin cout与printf和scanf几乎相同。关闭同步的语法:using namespace std;iOS::sync_w...
  • OOFFrankDura
  • OOFFrankDura
  • 2018年01月18日 11:06
  • 166

九度cin/cout耗时原因

做九度题的时候,由于数据量大,很多情况下得用scanf和printf代替cin和cout用于输入输出,不然会报错超时不能AC。 有三条建议用于提高C++的输入输出速度: At the firs...
  • wtyvhreal
  • wtyvhreal
  • 2014年12月13日 15:25
  • 4783

C++ ACM 基础 cin重定向 cout 格式化输出

#include #include #include #include using namespace std; int n; int main() { //用 stdin 可以写相对路径...
  • gaotong2055
  • gaotong2055
  • 2013年04月23日 11:17
  • 2516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 之cin与cout常见问题详解
举报原因:
原因补充:

(最多只允许输入30个字)