关于istream输入流对象cin的输入函数

I/O

输出流:ostream

输入流:istream

输入输出流:iostream

iostream中定义了输入流对象cin与输出流对象cout

cin是一个istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取运算符>>从流中提取数据。流提取符“>>”从流中提取数据时通常跳过输人流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符>>才能从中提取数据。

cout是一个ostream类的对象,它通过流插入运算符<<向输出设备(屏幕)输出其后的变量。程序中的变量借由cout对象并通过流插入运算符<<向输出设备输出。

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。

cin>>

/*cin>>T
接受一个字符串,遇空格tab换行结束,返回cin对象。
>>(流提取符)用于从cin输入流中提取指定类型数据赋值给T
*/

若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符。

若缓冲区为空,则继续等待。

分隔符残留在缓冲区

cin.get()

int cin.get();//接受一个字符(包括空格tab换行)并返回该字符的asc码值
istream& cin.get(char& var);//接受一个字符(包括空格tab换行)
istream& cin.get(char* s, streamsize n);//以指定长度读取字符串(读取到n-1个字符),遇换行符结束读取
istream& cin.get(char* s,  streamsize  n, char delim);以指定长度读取字符串,遇指定的字符delim结束读取
//还有两种get的重载形式,但暂时不用
//使用第三、四种get,注意结束符需要用第一或第二中get清除缓冲区的结束符,否则会出错

结束符残留在缓冲区

cin.getline()

//从标准输入设备键盘读取一串指定长度的字符串,并以指定的结束符结束。
istream& cin.getline(char* s, streamsize count); 
istream& cin.getline(char* s, streamsize count, char delim);

与cin.get()区别:

  • 结束符不会残留在缓冲区。
  • cin.get(char*,int)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline(char*,int)当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。

getline()

C++中定义了一个在std名字空间的全局函数getline,因为这个getline函数的参数使用了string字符串,所以声明在了< string>头文件中了。

//从输入流is中读取一行到字符串str中,当遇到如下三种情况会结束读操作:1)到文件结束,2)遇到结束符,3)输入达到最大限度。
istream& getline(istream& is, string& str);
istream& getline(istream& is, string& str, char delim);

注意,getline遇到结束符时,结束符不会残留在缓存中。因此,进行从键盘读取一行字符时,建议使用getline,较为安全。

注:如果输入流是文件输入流(即读取文件),则就变为读取文件了;如果输入流是字符串流(stringstream),则变为处理字符串。

// 读取一行并按照逗号分隔
#include <iostream>
#include <string>
#include <sstream>

// 第一种方式    
string str_line;
while(getline(cin, str_line))
{
    stringstream ss(str_line);
    string str_tmp;
    while(getline(ss, str_tmp, ','))
        cout << str_tmp;
}
// 第二种方式
string str_temp;
while(getline(cin, str_line, ','))
{
    stringstream ss(str_line);
    string str_tmp;
    while(ss >> str_num)
        cout << str_tmp;
}

gets()

gets是C中的库函数,在< stdio.h>申明,从标准输入设备读字符串,可以无限读取,不会判断上限,以回车结束或者EOF时停止读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。

//函数原型:char *gets( char *buffer );

cin.good()与cin.fail()用于判断cin输入的类型是否符合要求

int a;
cin >> a;
if (!cin.good())
    //输入类型错误
//do something...

另,

// <<与>>的重载实例
#include <iostream>
using namespace std;

class Complex {
public:
  friend ostream& operator << (ostream&,Complex&); //声明重载运算符“<<”
  friend istream& operator >> (istream&,Complex&); //声明重载运算符“>>”
private:
  double real;
  double imag;
};
ostream& operator << (ostream& output,Complex& c) {//定义重载运算符“<<”
  output<<"("<<c.real<<"+"<<c.imag<<"i)";
  return output;
}
istream& operator >> (istream& input,Complex& c) {//定义重载运算符“>>”
  cout<<"input real part and imaginary part of complex number:";
  input>>c.real>>c.imag;
  return input;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值