当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
2015年计算机二级C++流考点归纳
发布时间:2012/1/11 10:46:57 来源:城市学习网 编辑:ziteng

第10章 C++流

  10.1 C++流的概念

  1C+ +流的体系结构

  要利用C+ +流,必须在程序中包含有关的头文件,以便获得相关流类的声明。为了使用新标准的流,相关头文件的文件名中不得有扩展名。与C+ +流有关的头文件有:

  iostream:要使用cin、cout的预定义流对象进行针对标准设备的I/O操作,须包含此文件。

  fstream:要使用文件流对象进行针对磁盘文件的I/O,操作须包含此文件。

  strstream:要使用字符串流对象进行针对内存字符串空间的I/O操作,须包含此文件。

  iomanip:要使用setw、fixed等大多数操作符,须包含此文件。

  注意,为了使用新标准的C+ +流,还必须在程序文件的开始部分插入下面这个名字空间声明:

  using namespace std;

  2 预定义流对象

  C+ +流有4 个预定义的流对象,它们的名称及与之联系的I/O设备如下:

  cin 标准输入

  cout 标准输出

  cerr 标准出错信息输出

  clog 带缓冲的标准出错信息输出

  3提取运算符和插入运算符

  输入流类istream重载了运算符,用于数据输入,其原形具有

  istream& operator( istream&,类型修饰&); 的形式。重载的的功能是从输入流中提取数据赋值给一个变量,因此称之为提取运算符(extractor)。当系统执行cinx操作时,将根据实参x的类型生成相应的提取运算符重载函数的实例并调用该函数,把x 引用传送给对应的形参,接着从键盘的输入 缓冲区中读入一个值并赋给x(因形参是x的引用)后,返回istream流,以便继续使用提取运算符为下一个变量输入数据。

  输出流类ostream重载了运算符,用于数据输出,其原形具有

  ostream& operator(ostream&,类型修饰);

  的形式。重载的的功能是把表达式的值插入到输出流中,因此称之为插入运算符(inserter)。当系统执行coutx操作时,首先根据x值的类型调用相应的插入运算符重载函数,把x 的值传送给对应的形参,接着执行函数体,把x 的值(亦即形参的值)输出到显示器屏幕上,在当前屏幕光标位置起显示出来,然后返回ostream流,以便继续使用插入运算符输出下一个表达式的值。

  上面格式中的“类型修饰符”是指char、int、double、char*、bool等等C+ +中固有类型的修饰符。也就是说,只要输入输出的数据属于这些C+ +固有类型中的一种,就可以直接使用或完成输入输出任务。在完成输入输出任务后,和把第一参数(即流对象的引用)返回,因此这两个运算符可以连续使用,如cinabc;等。

  4有格式输入输出和无格式输入输出

  利用C+ +流既可进行有格式输入输出,也可进行无格式输入输出。

  计算机所处理的数据都有内部存储格式和外部表现形式的区分,因此在输入输出过程中必须进行适当的转换,有格式输入输出就是完成这一任务的。有格式输入输出针对的是键盘、显示器、打印机等字符设备以及磁盘中的文本文件。对于有格式输入输出,无论输入输出的数据是什么数据类型,体现在外部设备上都是字符序列。

  对于无格式输入输出,数据的内部存储存格式与外部存储格式完全相同,因此无格式输入输出只能针对磁盘文件(或磁带、光盘上的文件),而且这样的文件通常不能用一般的文本编辑器查看。进行无格式输入输出需调用流对象的专门的成员函数实现。

  5操作符

  C+ +流提供了提取运算符和插入运算符,使得输入输出的表达简洁、形象、直观,这最能体现C+ +流的风格。C+ +流还提供了很多输入、输出或控制输入输出的成员函数,须通过.或-加以调用,不能与运算符或配合使用,因而与C+ +流的整体风格很不协调。为此,C+ +提供了一系列可与运算符或配合使用的特殊函数,称为操作符(manipulator)。每个操作符都与一个具体的函数相联系,使得或可间接地通过它们调用与之联系的函数,完成相应的输入 、输出功能或输入输出控制功能。前面经常用到的endl、setw等就是操作符。有了操作符,C+ +流操作在风格上就更加统一,输入输出操作也显得更加流畅。

  10.2 输入输出的格式控制

  1默认的输入输出格式

  在没有特地进行格式控制的情况下,输入输出采用默认格式。

  (1)默认的输入格式

  C+ +流所识别的输入数据的类型及其默认的输入格式包括:

  short、int、long(signed、unsigned):与整型常量同

  float、double、long double:与浮点数常量同

  char(signed、unsigned):第一个非空白字符

  char *(signed、unsigned):从第一个非空白字符开始到下一个空白字符结束

  void*:无前缀的16进制数

  bool:把true或1识别为true,其他的均识别为false(vc6.0中把0识别为false,其他的值均识别为true)

  (2)默认的输出格式

  C+ +流所识别的输出数据的类型及其默认的输出格式包括:

  char(signed、unsigned): 单个字符(无引号)

  short、int、long(signed、unsigned):一般整数形式,负数前有-号

  char *(signed、unsigned): 字符序列(无引号)

  float、double、long double:浮点格式或指数格式(科学表示法),取决于哪个更短

  void *: 无前缀的16进制数

  bool: 1或0

  2.格式标志与格式控制

  在作为流库根类的ios_base中,有一个作为数据成员的格式控制变量,专门用来记录格式标志;通过设置标志,可以有意识地对有格式输入输出的效果加以控制。各种格式标志被定义为一组符号常量。

  这些作为格式标志的常量与整数的对应关系是精心安排的,每一个标志对应一个二进制位,为1时表示对应标志已设置,为0时表示对应标志未设置。这些作为标志的二进制位保存在格式控制变量的低端的若干位中,每一个流对象都有这样一个作为数据成员的格式控制变量。在外部使用这些格式标志时,必须在标志前加上ios_base::修饰。

  格式标志中的有些关系密切的相邻标志被规定为域,一共有三个:由left、right和 internal组成的域称为adjustfield(对齐方式域);由dec、oct和hex组成的域称为basefield(数制方式域);由scientific和fixed组成的域称为floatfield(浮点方式域)。adjustfield、basefield和floatfield也是在ios_base中定义的,因此在外部使用时也必须加上域修饰前缀ios_base::(如ios_base::adjustfield)。  [NextPage]

  可以通过调用流对象的下列三个成员函数直接设置格式控制标志:

  ●fmtflags setf(fmtflags fmtfl,fmtflags mask);

  其中类型fmtflags实际上就是类型int。参数fmtf1为格式控制标志,参数mask为域。此函数用于设置某个域中的标志,设置前先将该域中所有标志清除。函数返回设置前的格式控制标志。

  ●fmtflags setf(fmtflags fmtf1);

  其中参数fmtf1为格式控制标志。此函数用于设置指定的标志,即将指定的标志位置为1,其他标志位不受影响。函数返回设置前的格式控制标志。此函数多用于adjustfield、basefield和floatfield三个域之外的格式控制标志的设置。

  ●void unsetf(fmtflags fmtf1);

  其中参数fmtf1为格式控制标志或域。此函数用于清除指定标志或域,即将指定标志位或域清0。

  除了使用上述函数外,还可以用操作符进行格式控制。对应于上述setf函数的操作符是:setiosflags(<格式控制标志>),对应于上述的unsetf函数的操作符是 :resetiosflags(格式控制标志或域)。

  3输入输出宽度的控制

  宽度的设置可用于输入,但只对字符串输入有效。对于输出,宽度是指最小输出宽度。当实际数据宽度小于指定的宽度时,多余的位置用填充字符(通常是空格)添满;当实际数据的宽度大于设置的宽度时,仍按实际的宽度输出。初始宽度值为0,其含义是所有数据都将按实际宽度输出。宽度的设置与格式标志无关。有关的操作符是:

  ●setw(int n):设置输入输出宽度;

  等价函数调用:io.width(n)

  其中n为一个表示宽度的表达式。如果用于输入字符串,实际输入的字符串的最大长度为n-1。也就是说宽度n连字符串结束符也包含在内。函数 width返回此前设置的宽度;如果只需要这个返回值,可不给参数。

  注意:宽度设置的效果只对一次输入或输出有效,在完成了一个数据的输入或输出后,宽度设置自动恢复为0(表示按数据实际宽度输入输出)。宽度设置是所有格式设置中唯一的一次有效的设置。

  4浮点数输出方式的控制

  在初始状态下,浮点数都按浮点格式输出,输出精度的含义是有效位的个数,小数点的相对位置随数据的不同而浮动;可以改变设置,使浮点数按定点格式或指数格式(科学表示法,如3.2156e+2)输出。在这种情况下,输出精度的含义是小数位数,小数点的相对位置固定不变,必要时进行舍入处理或添加无效0。设置的输出方式一直有效,直到再次设置浮点数输出方式时为止。有关操作符有:

  ●resetiosflags(ios_base::floatfield):(此为默认设置)浮点数按浮点格式输出;

  等价函数调用:o.unsetf(ios_base::floatfield)

  ●fixed :浮点数按定点格式输出;

  等价函数调用:o.setf(ios_base::fixed,ios_base::floatfield)

  ●scientific:浮点数按指数格式(科学表示法)输出;

  等价函数调用:o.setf(ios_base::scientific,ios_base::floatfield)。

  5输出精度的控制

  输入输出精度是针对浮点数设置的,其实际含义与浮点数输出方式有关:如果采用的是浮点格式,精度的含义是有效位数;如果采用的是定点格式或指数格式(科学表示法),精度的含义是小数位数。精度的设置用于输出,默认精度为6,可以通过设置改为任意精度;将精度值设置为0意味着回到默认精度6。设置的精度值一直有效,直到再次设置精度时为止。精度的设置与格式标志无关。有关操作符是:

  ●setprecision(int n) :设置浮点数的精度(有效位数或小数位数);

  等价函数调用:io.precision(n)

  其中n为表明精度值的表达式。函数返回此前设置的精度;如果只需要这个返回值,可不给参数。

  6对齐方式的控制

  初始状态为右对齐,可以改变这一设置,使得输出采用左对齐方式或内部对齐方式。设置的对齐方式一直有效,直到再次设置对齐方式时为止。只有在设置了宽度的情况下,对齐操作才有意义。有关操作符有:

  ●left:在设定的宽度内左对齐输出,右端填以设定的填充字符;

  等价函数调用:o.setf(ios_base::left,ios_base::adjustfield)

  ●right:(此为默认设置)在设定的宽度内右对齐输出;

  等价函数调用:o.setf(ios_base::right,ios_base::adjustfield)

  ●internal:在设定的宽度内右对齐输出;但若有符号(-或+),符号置于最左端;

  等价函数调用:o.setf(ios_base::internal,ios_base::adjustfield)

  7小数点处理方式的控制

  此设置只影响采用浮点格式输出的浮点数据。在初始状态下,若一浮点数的小数部分为0,则不输出小数点及小数点后的无效0;可以改变这一设置,使得在任何情况下都输出小数点及其后的无效0。设置的小数点处理方式一直有效,直到再次设置小数点处理方式时为止。有关操作符有:

  ●showpoint:即使小数部分为0,也输出小数点及其后的无效0;

  等价函数调用:o.setf (ios_base ::showpoint)

  ●noshowpoint:(此为默认设置)取消上述设置:小数部分为0时不输出小数点;

  等价函数调用:o.unsetf(ios_base::showpoint)

  8填充字符的控制

  在输出数据时,如果数据宽度小于设置的宽度,则空闲位置要用填充字符填满。初始填充字符为空格,可以将别的字符设置为填充字符。设置的填充字符一直有效,直到再次设置填充字符时为止。只有在设置了宽度的情况下,字符填充操作才有意义。填充字符的设置与格式标志无关。有关操作符是:

  ●setfill

  (char c):设置填充字符;

  等价函数调用:io.fill(c)

  函数返回此前设置的填充字符;如果只需要这个返回值,可不给参数。

  9插入换行符

  ●end1:插入换行符(即’\ n’)并强制写缓,实现输出的回车换行(与格式标志无关);

  等价函数调用:o.put(o.widen(’\n’));o.flush()

  10其他格式控制方式

  (1)插入字符串结束符。

  (2)输入输出数制状态的控制。

  (3)逻辑常量输出方式的控制。

  (4)前导空白字符处理方式的控制。

  (5)缓冲区工作方式的控制。

  (6)正数的符号表示方式的控制。

  [NextPage]

  10.3 文件流

  文件流以磁盘文件以及其他可按文件方式进行管理的外部设备为输入输出对象。ifstream是文件输入流类,ofstream是文件输出流类,fstream是文件输入输出流类。要利用这些类来定义文件流对象,必须在程序的开始部分包含如下的预处理命令和名字空间声明:

  #include

  using namespace std;

  1文件流的建立

  每个文件流都应当与一个打开的文件相联系。可以用两种不同的方式打开文件。

  (1)在建立文件流对象的同时打开文件。

  (2)先建立文件流对象,再在适当的时候打开文件。

  2文件流的关闭

  关闭文件流用成员函数close(),例如若fin是一个文件流对象,则可用下面的语句关闭:

  fin.close ();

  如果程序没有用close()主动关闭文件,则在文件流对象退出其作用域时,被自动调用的析构函数会关闭该对象所联系的文件。但我们提倡在打开的文件不再需要时及时并主动地将之关闭,以便尽早释放所占用的系统资源并尽早将文件置于更安全的状态。

  3文件流状态的判别

  可以用文件流对象的下列成员函数来判别文件流的当前状态:

  is_open():判定流对象是否与一个打开的文件相联系,若是,返回true,否则返回false;

  good():刚进行的操作成功时返回true,否则返回false;

  fail():与good()相反,刚进行的操作失败时返回true,否则返回false;

  bad():如果进行了非法操作返回true,否则返回false;

  eof():进行输入操作时,若到达文件尾返回true,否则返回false.

  也可以直接针对流对象进行判断。假定input是一流对象,则

  if (! input)…等同于if(input.fail())…

  if (input)…等同于if(input.good())…

  4文件流的定位

  (1)文件位置与定位方式

  流的位置以字节为单位,通常表示为一个长整数,用类形符号pos_type代表。C+ +流的位置有两种:输入(get)位置和输出(put)位置。输入流只有输入位置,流对象中标志这种位置的指针称为输入指针。输出流只有输出位置,流对象中标志这种位置的指针称为输出指针。输入输出流两种位置都有,因而同时具备输入指针和输出指针:这两个指针可以分别控制、互不干扰。对于文件流,这两种指针可统称文件指针。

  每一次输入或输出都是从指针所指定的位置处开始的,指针在输入输出过程中不断移动,完成输入或输出 后即指向下一个需要输入或输出的位置。因此,在进行一般的输入输出操作时,指针总是向后(文件尾方向)移动。

  也可以通过专门的定位操作操纵指针,而且既可以向后移动,也可以向前移动,见下面的说明。C+ +流的定位方式(也就是指针移动方式)有三种,被定义为ios_base::seek_dir中的一组枚举符号:

  ios_base::beg 相对于文件首

  ios_base::cur 相对于当前位置(负数表示当前位置之前)

  ios_base::end 相对与文件尾

  (2)输入定位

  输入流对象中与输入定位有关的成员函数有:

  ●istream_type seekg(off_type off,ios_base ::seek_dir dir);

  按方式dir将输入定位于相对位置off处,函数返回流对象本身的引用

  ●pos_type tellg();

  返回当前的输入位置,即从流开始处到当前位置的字节数

  ●bool eof()const;

  判定输入流是否结束,结束时返回true,否则返回false。

  (3)输出定位

  在输出流对象中与输出定位有关的成员函数有:

  ●ostream_type& seekp( pos_type pos);

  (绝对定位)将输出流定位于绝对位置pos,函数返回流对象本身的引用

  ● ostream_type& seekp(off_type off,ios_base ::seekdir dir);

  (相对定位)按方式dir将输出流定位于相对位置off处,函数返回流对象本身的引用

  ●pos_type tellp();

  返回当前的输出位置(pos_type通常就是long),即从流开始处到当前位置的字节数。

  5特殊的文件流:CON和PRN

  以"CON"为文件名建立的输入流所联系的设备是键盘,可用于键盘输入;以"CON"为文件名建立的输出流所联系的设备是显示器,可用于显示输出。

  6有格式输入输出

  针对文件的格式化输入输出与针对标准设备cin和cout的输入输出十分相似,但仍有两点需要注意。

  作为格式化输入输出,所操作的文件都是纯文本文件,因此可以用记事本或写字板等文本编辑器来准备这样的数据文件,以供应用程序输入处理;应用程序通过格式化输出所生成的数据文件也同样可以用记事本或写字板等文本编辑器来查看。

  每一个作为格式化输入源的流对象(如cin或一个输入文件流)都有一个流结束标记,读到该标记即表明其后没有更多的数据了。可以用流的成员函数eof()来判断是否读到流结束标记。对于输入流对象cin,可以通过在键盘上打入Z来插入流结束标记,但在完成输入后,必须执行一次cin.clear();后,cin才能继续使用。

  7无格式输入输出

  对于无格式输入输出,数据的内部存储格式与外部存储格式完全相同。无格式输入输出很多情况下是针对二进制文件的,输入输出需要用read函数或write函数,因而要求文件是按ios_base::binary模式打开的。注意和不能用于按ios_base::binary打开的文件(二进制文件)的输入和输出。

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved