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;
}