学科分类
目录
C++基础

预定义流对象

为了方便用户对基本输入输出流进行操作,C++提供了四个预定义的标准流对象:cin、cout、cerr和clog。当用户在程序中包含了头文件iostream时,编译器调用相应的构造函数产生这4个标准流对象,用户在程序中就可以直接使用它们了。

其中cin是istream类的对象,用于处理标准输入(即键盘输入);cout是ostream类的对象,用于处理标准输出(即屏幕输出);cerr和clog也都是ostream类的对象,用于处理标准出错信息,并将信息显示到屏幕上。

在这四个标准流对象中,除了cerr不支持缓冲外,其余3个都带有缓冲区。这4个预定义对象信息见表1。

表1 预定义流对象

对象名 所属类 对应设备 含义
cin istream 键盘 标准输入,有缓冲
cout ostream 屏幕 标准输出,有缓冲
cerr ostream 屏幕 标准错误输出,无缓冲
clog ostream 屏幕 标准错误输出,有缓冲

cin与提取运算符“>>”结合使用,cout、cerr与clog与插入运算符“<<”结合使用,完成了C++中所有的输入输出操作,接下来我们就分别来学习这四个流对象。

1、cin

cin是istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过提取运算符“>>”从流中提取数据,然后送给cin对象,由cin将对象送到指定地方。

(1) cin是带缓冲区的输入流对象,只有在输入完数据按下回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据,例如下面的代码:

int a;
cin>>a;

此时若从键盘上输入10,则10只是存入缓冲区而并不能为“>>”运算符提取,当按下回车键后,相当于执行endl语句,则缓冲区中内容才被刷新形成输入流,被“>>”运算符提取,然后传递给cin对象,由cin对象送到变量a中存储。

从流中读取数据要保证能正常进行。例如,如果针对上述代码从键盘输入“abc”,则提取操作会失败,此时,cin流被置为出错状态。只有在正常状态时才能从输入流中提取数据,这也是C++I/O的安全性体现。

(2)除了单个变量读取,cin对象也可以一次读入多个变量的值,因为“>>”运算符返回的是istream的引用,可连续提取数据,如下面代码所示:

char c1,c2;
cin>>c1>>c2;

若从键盘输入’a’、’b’两个字符,上面的cin语句把输入的’a’字符送给变量c1,把输入的’b’字符送给c2。当输入多个数值时,要在数值之间加空格以示区分,cin读到空格时,就能够区别输入中的各个数值。

除了在输入的数据之间加空格,也可以在每输入一个数据后按回车键,这样完全可以正确的读入数据。

(3)采用cin对象也可以对不同类型的变量读入数据,例如下面的代码:

string s;
float f;
cin>>s>>f;

当从键盘正确输入字符串和float类型的值时,cin将它们分别存储到对应变量中。字符串的读入也可以采用字符数组存储,例如:

char str[10];
cin>>str;

如果用一个字符数组存储字符串,要确保输入的字符串不超出字符数组的大小,否则会发生溢出,破坏内存中的其他数据。

2、cout

cout是ostream类预定义的对象,对应的标准设备为屏幕,称作标准输出对象或屏幕输出对象,但也可以重定向输出到磁盘文件。用户可以通过cout对象调用ostream类的插入运算符和成员函数来输出信息。

(1)利用cout对象可以直接输出常量值,代码如下所示:

cout << 10 << endl;
cout << 'a' << endl;
cout << "C++" << endl;

在输出常量值时,直接将要输出的内容放在“<<”运算符后面即可。

(2)利用cout对象输出变量的值,代码如下所示:

int a = 10;
string s = "C++";
float f = 1.2;
cout << a << endl; //输出int类型的变量
cout << s << endl; //输出string类型的变量
cout << f << endl; //输出float类型的变量

在用cout输出变量值时,不必设置以什么格式输出,“<<”运算符会根据变量的数据类型自动调用相匹配的重载函数,而正确输出。这比C语言中的printf()函数用法更简便。

(3)利用cout对象输出指针、引用类型的数据,代码如下所示:

int a = 10,*p;
int& b = a;
p = &a;
string s = "C++";
string* ps = &s;
cout << p << endl; //输出结果是指针p的值,a变量的地址
cout << b << endl; //输出结果是b的值10
cout << *p << endl; //输出结果是指针p指向的变量的值,即a的值10
cout << ps << endl; //输出结果是指针ps的的值,s变量的地址
cout << *ps << endl; //输出结果是指针ps指向的变量的值,即s的值”C++”

当输出数据类型为指针或引用时,与printf()函数的用法一致,不加“”符号是输出指针的值,即变量的地址,带有“”符号输出的是指针指向的变量的值,它比printf()的简便之处在于不必设置数据的输出格式。

(4)cout对象可以连续输出数据,代码如下所示:

int a = 10;
char c = 'a';
cout << a << "," << c << endl;

因为“<<”重载函数返回的都是ostream类对象的引用,所以cout调用“<<”运算符输出时也可以连续输出。在连续输出的数据之间可以自定义数据分隔符,如上述代码中用“,”符号将a与c两个变量分隔开。

关于cout对象的调用,读者在前面章节的学习中也使用较多,本节就不过多讲解其基本输出。cout也和printf()一样可以格式化输出,关于其格式化输出,将在6.4节讲解。

3、cerr和clog

cerr与clog都是ostream类预定义的流对象,都是用于标准错误输出,默认设备都是显示器。只是cerr没有缓冲,意味着信息将被直接发送给屏幕,不会等到缓冲区填满或遇到换行符才输出错误信息。

cerr与clog多用于输出调试信息,对于初学者来说,带缓冲区的cout输出流对象已经足够使用,cerr与clog了解即可。

点击此处
隐藏目录