一.C++流的概念
C++流的体系结构
C++为实现数据的输入输出定义了一系列的流类,这些类之间存在派生、继承关系。
要利用C++流,必须在程序中包含有关的头文件,以便获得相关流类的声明。为了使用新标准的流,相关头文件的文件名中不得有扩展名。与C++流有关的头文件有:
- iostream:使用cin、cout等预定义流对象针对标准设备进行I/O操作。
- fstream:使用文件流对象针对磁盘文件进行I/O操作。
- strstream:使用字符串流对象针对内存字符串空间进行I/O操作。
- iomanip:使用setw、fixed等操作符进行格式控制。
预定义流对象
C++流有四个预定义的流对象,它们的名称及与之联系的I/O设备如下:
- cin 标准输入。
- cout 标准输出。
- cerr 标准出错信息输出。
- clog 带缓冲的标准出错信息输出。
其中cin为istream类对象,其余三个为ostream类对象。通常情况下,标准输入设备就是指键盘,标准输出设备和标准出错信息输出设备就是指显示器。
提取运算符>>和插入运算符<<
输入流类istream重载了运算符>>,用于数据输入,其原型为:
istream& operator>>( istream&, <类型>&);
重载的>>的功能是从输入流中提取数据赋值给一个变量,因此称之为提取运算符(extractor)。当系统执行cin>>x操作时,将根据实参x的类型调用相应的提取运算符重载函数,把x的引用传递给对应的形参,接着从键盘的输入缓冲区中读入一个值并赋给x后,返回istream流,以便继续使用提取运算符为下一个变量输入数据。
输出流类ostream重载了运算符<<,用于数据输出,其原型为:
ostream& operator<<( ostream&,const<类型>&);
重载的<<的功能是把表达式的值插入到输出流中,因此称之为插入运算符(inserter)。当系统执行cout<<x操作时,首先根据x的类型调用相应的插入运算符函数,把x的值传送给对应的形参,接着执行函数体,把x的值输出到显示器屏幕上,在当前屏幕光标位置显示,然后返回ostream流,以便继续使用插入运算符输出下一个表达式的值。
有格式输入输出和无格式输入输出
利用C++流既可以进行有格式输入输出,也可以进行无格式输入输出。
有格式输入输出针对的是键盘、显示器、打印机等字符设备以及磁盘中的文本文件。所以,cin、cout等预定义流对象只能用于有格式输入输出。提取运算符>>和插入运算符<<也只能用于有格式输入输出。
无格式输入输出只能针对磁盘文件,需调用流对象中专门的成员函数实现。
操作符
除了提取运算符>>和插入运算符<<,使得输入输出的表达简洁、形象、直观外,C++流还提供了能够与运算符>>或<<一起工作的预定义操作符,用来控制输入输出。有了操作符,C++流操作在风格上更加统一,输入输出操作也更加流畅。
例如:cout << “Value=” << setw(6) << i;
其中的setw用来设置输出宽度。C++流提供了很多操作符,包含在头文件iomanip中。