C++的iostream标准库介绍(1)2

来源:互联网 发布:java软件开发流程图 编辑:程序博客网 时间:2024/05/29 10:39

iostream库定义了以下三个标准流对象:

  1.cin,表示标准输入(standard input)的istream类对象。cin使我们可以从设备读如数据。
  2.cout,表示标准输出(standard output)的ostream类对象。cout使我们可以向设备输出或者写数据。
  3.cerr,表示标准错误(standard error)的osttream类对象。cerr是导出程序错误消息的地方,它只能允许向屏幕设备写数据。

  输出主要由重载的左移操作符(<<)来完成,输入主要由重载的右移操作符(>>)完成。

  >>a表示将数据放入a对象中。
  <<a表示将a对象中存储的数据拿出。

  这些标准的流对象都有默认的所对应的设备,见下表:

  图中的意思表明cin对象的默认输入设备是键盘,cout对象的默认输出设备是显示器屏幕。

  那么原理上C++有是如何利用cin/cout对象与左移和右移运算符重载来实现输入输出的呢?

  下面我们以输出为例,说明其实现原理

  cout是ostream类的对象,因为它所指向的是标准设备(显示器屏幕),所以它在iostream头文件中作为全局对象进行定义。

  ostream cout(stdout);//其默认指向的C中的标准设备名,作为其构造函数的参数使用。

  在iostream.h头文件中,ostream类对应每个基本数据类型都有其友元函数对左移操作符进行了友元函数的重载。
  ostream& operator<<(ostream &temp,int source);
  ostream& operator<<(ostream &temp,char *ps);
  。。。。等等

  一句输出语句:cout<<"www.cndev-lab.com";,事实上调用的就是ostream& operator<<(ostream &temp,char *ps);这个运算符重载函数,由于返回的是流对象的引用,引用可以作为左值使用,所以当程序中有类似cout<<"www.cndev-lab.com"<<"中国软件开发实验室";这样的语句出现的时候,就能够构成连续输出。

  由于iostream库不光支持对象的输入输出,同时也支持文件流的输入输出,所以在详细讲解左移与右移运算符重载只前,我们有必要先对文件的输入输出以及输入输出的控制符有所了解。

  和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示。

  由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在fstream.h头文件中是没有像cout那样预先定义的全局对象,所以我们必须自己定义一个该类的对象,我们要以文件作为设备向文件输出信息(也就是向文件写数据),那么就应该使用ofstream类。

  ofstream类的默认构造函数原形为:

  ofstream::ofstream(const char *filename,int mode = ios::out,int openprot = filebuf::openprot);

  filename:  要打开的文件名
  mode:    要打开文件的方式
  prot:    打开文件的属性

  其中mode和openprot这两个参数的可选项表见下表:

mode属性表

  ios::app:   以追加的方式打开文件
  ios::ate:   文件打开后定位到文件尾,ios:app就包含有此属性
  ios::binary:  以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
  ios::in:    文件以输入方式打开
  ios::out:   文件以输出方式打开
  ios::trunc:  如果文件存在,把文件长度设为0

  可以用“或”把以上属性连接起来,如ios::out|ios::binary。

openprot属性表:

  0:普通文件,打开访问
  1:只读文件
  2:隐含文件
  4:系统文件

  可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。

原创粉丝点击