关于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>>会将其忽略并清除,继续读取下一个字符。

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

分隔符残留在缓冲区

get()与cin.get()

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

结束符残留在缓冲区

cin.getline()

//从标准输入设备键盘读取一串指定长度的字符串,并以指定的结束符结束。
istream& getline(char* s, streamsize count); 
istream& 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,较为安全。

注:如果输入流是文件输入流(即读取文件),则就变为读取文件了。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章