C++里并没有任何关于输入输出流的定义,而是在标准库 (standard library)中包含了iostream库 (iostream library),iostream库 包含了istream和ostream两个基础类型,istream表示输入流而ostream表示输出流。
(一个stream就是一个字符序列,术语”stream“想要表达的意思是:随着时间推移,字符是顺序生成或消耗的。)
standard library中定义了四个IO对象(object):
- cin 标准输入(standard input) 为istream对象,用于输入。
- cout 标准输出(standard output)。
- cerr 标准错误(standard error)。
- clog
后三个都为ostream 对象 ,用于输出。
其中cerr 用于输出警告和错误信息,clog 用于输出程序运行时的一般信息。
在程序中,若我们要使用标准库的设施,那我们必须先包含相关的头文件(header file),所以若我们要用到iostream 的设施,必须先包含iostream 这个头文件:
#include<iostream>
一、先来讲讲输出流
下面是一个表达式:
std::cout << "Enter two numbers:" << std::endl;
首先指出,标准库中定义的多有名字都在命名空间(namespace)std 中, 所以当使用标准库 的设施时,都要在名字前面加std并用作用于运算符::指向std命名空间.
for example:
std::cout
std::cin
std::cerr
std::clog
再来讲讲上面那个表达式,表达式中“<<” 是一个输出运算符,用于在标准输出(standard output)中打印消息。
“<<” 运算符接受两个运算对象,左侧必须是一个ostream对象,右侧的运算对象是要打印的值 。“<<” 运算符将给定的值写到给定的ostream对象中,运算结果就是写如给定值的这个ostream对象,即运算结果是一个ostream对象,只是这个ostream对象中已经写入了给定的数据。
上面那个表达式也等于:
(std::cout << "Enter two numbers:") << std::endl;
//or
std::cout << "Enter two numbers:";
std::cout << std::endl;
最后再讲一下表达式中的数据:
1.双引号里的是一个字符串字面值常量*(string literal*),顾名思义,字符串字面值常量的值就是表面看到的字符串。
2.第二个被打印的消息是endl (end line),他的名称是操纵符(manipulator),endl 的功能不仅仅是结束当前行,更重要的功能是endl能够刷新缓冲区,即将与设备相关的缓冲去区里的内容冲刷到设备中,这个动作的意义在于可以保证到目前为止,程序所产生的所有输出都真正的写入输出流中,而不是停留在内存中等待输入流。
二、再来讲讲输入流
下面是一个表达式:
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
首先是初始化(initialize)了两个int型变量,用来存储数据。
“>>” 是一个输入运算符,与输出运算符相类似,“>>”
接受一个istream作为其左侧运算对象,并接受一个对象作为其右侧运算对象 用于保存从输入流中读取的数据,这里是v1,v2。同样的与输出运算对象类似,“>>” 返回其左侧运算对象最为运算结果,即一个数据已被读取了的istream对象。
所以上面那个表达式也等价于:
(sdt::cin >> v1) >> v2;
//or
std::cin >> v1;
std::cin >>v2;
三、最后的最后
再来看看一个表达式:
std::cout << "The sum of" << v1 << " and " << v2 << " is "
<< v1 + v2 << std::endl;
上面可以看到一个有意思的地方:
就是运算对象并不都是相同的类型,”The sum of”是字符串字面值常量,而v1,v2则是int型。
这是因为,标准库定义了不同版本的输入输出运算符,用于处理这些不同的数据类型,这也是一种运算符重载。
下一篇再来讲讲这些输入输出运算符的聪明之处。