在C++中,标准输出流通常指的是与标准输出设备(通常是终端或控制台)相关联的流对象。这个流对象在C++标准库中被定义为std::cout、std::err、std::clog,它们是std::ostream类的一个实例。
一、cout,cerr和clog流
ostream类定义了3个输出流对象,即cout,cerr,clog。
1.1cout流对象
(1) cout是console output的缩写,意为控制台(终端显示器)的输出。它不是C++预定义的关键字,而是ostream流类的对象,在iostream中定义。顾名思义,流是流动的数据,cout流是流向输出(显示设备)的数据,cout流中的数据是用流插入运算符“<<“顺序加入的。
示例如下:
cout <<"Hello World!" <<"I am learning C++.";
cout流是容纳数据的载体,而并不是运算符。cout将它们输送到输出设备上显示,在显示设备上输出”Hello Wordl! I am learning C++.“。
(2) 在使用"cout <<"输出基本类型的数据时,不必考虑数据是什么类型,系统会自动判断数据的类型,并根据类型选择调用与之匹配的运算符重载函数。示例如下:
cout <<10.0f <<100.58 <<'=' <<"operator";
(3) cout流在内存中对应开辟了一个缓冲区,用来存储流中的数据,当向cout流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符,并刷新流(清空缓冲区)。示例如下:
cout <<"Hello World" <<endl;
cout <<"I am learning C++" <<endl;
注意的是如果插入换行符”\n“,则只是换行而已,并不是刷新cout流,与endl刷新流是清空缓冲区不是一回事。
(4) 在iostream中只对”<<“和">>"运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出进行重载。所以用户可以声明新的类型,并用”<<“和">>"运算符对其进行输入输出另作重载。
1.2 cerr流对象
cerr流对象是标准出错流,cerr流已被指定为与显示器关联,cerr作用是向标准出错设备(standard error device)输出有关的出错信息。cerr是console error的缩写,意为在控制台(显示器)显示出错的信息。
注意的是cerr和cout的作用和用法虽然差不多,但是有一点不同的是,cout流通常是传送到显示设备输出,也可以被重定向输出到磁盘文件,而cerr流中的信息只能显示输出。
通过解一元二次方程,其一般解为
,但若a=0,或
时,用公式出错。编写程序,从键盘输入a、b、c的值,求
和
。如果a=0或
,输出错误信息。代码示例如下:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
float a, b, c, disc;
cout <<"Please enter the values of a, b, c:";
cin >>a >>b >>c;
// 如果a等于0输出错误信息
if(a == 0){
cerr <<"a is equal to zero, error!" <<endl;
} else{
// 如果b * b - 4 * a * c)结果小于0 ,输出错误信息
if( (disc = b * b - 4 * a * c) < 0 ){
cerr <<"Erro: dist=b*b-4*a*c<0" <<endl;
}
// 满足条件,则正常输出结果
else{
cout <<"x1 = " <<(-b + sqrt(disc) / (2*a)) <<