您好,欢迎访问三七文档
1第14章标准库2第14章标准库►14.1C++标准库►14.2标准输入输出►14.3标准模板库314.1C++标准库►C++标准库所有的头文件都没有扩展名(.h),内容总共在51个标准头文件中定义,如表14-1所列。其中18个cname形式的头文件(complex除外)内容与标准C语言的name.h头文件相同,但包含了C++扩展的功能。►在cname形式的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明。►另外,在C++中还可以使用name.h形式的C语言头文件,但不建议这样用。414.1C++标准库表14-1C++标准库索引分类功能头文件功能头文件C1C标准定义cstddefC++数值类型特性limits整型大小climits浮点型特性cfloatC标准实用工具cstdlib动态内存管理new运行时类型信息typeinfo异常处理exception可变参数cstdarg非局部跳转csetjmpC中断处理csignalC2标准输入输出iostream输入输出操纵器iomanipiostream基类ios输入输出前向声明iosfwd输入流类istream输出流类ostream字符串流类sstream文件流类fstream514.1C++标准库续表14-1C++标准库索引分类功能头文件功能头文件流缓存类streambufC标准输入输出cstdioC3异常类stdexceptC断言验证cassertC出错码cerrnoC4实用元件utility函数对象functional内存管理器memoryC时间日期ctimeC5字符串类stringC字符串cstring单字节字符类型cctype多字节字符类型cwctype扩展多字节宽字符cwcharC字符串流类strstreamC6向量vector列表list双队列deque队列queue614.1C++标准库续表14-1C++标准库索引分类功能头文件功能头文件栈stack映射map集合set位集bitsetC7迭代器iteratorC8算法algorithmISO646字符集替换ciso646C9复数complex数值矢量valarray数学运算numericC数学库cmathC10本地化localeC语言本地化clocale714.2标准输入输出►C++兼容支持C语言的printf、scanf和文件操作,但C++也提供了基于类的输入输出操作,具有类型安全和可扩展性。814.2.1C++流的概念►C++的输入输出是以字节流的形式实现的。►流是指由若干字节组成的字节序列的数据从一个对象传递到另一个对象的操作。►从流中读取数据称为提取操作,向流内添加数据称为插入操作。►流在使用前要建立,使用后要删除。►流具有方向性:与输入设备相联系的流称为输入流,与输出设备相联系的流称为输出流,与输入输出设备相联系的流称为输入输出流。►标准库内置了一些可以实现输入输出操作的流类,其对象称为流对象。914.2.1C++流的概念1.C++流类C++输入输出类库中包含许多流类(streamclass),如图14.1所示。图14.1流类及其派生关系1014.2.1C++流的概念►2.提取和插入运算符►在istream类中已经将运算符()重载为提取运算符,支持基本数据类型及其指针类型。►在ostream类中已经将运算符()重载为插入运算符。1114.2.1C++流的概念►3.预定义流对象►标准库将常用iostream类的流对象,定义在iostream头文件中,它们是:►①cin:与标准输入设备相关联的标准输入流(istream对象);►②cout:与标准输出设备相关联的标准输出流(ostream对象);►③cerr:与标准错误输出设备相关联的非缓冲方式的标准输出流(ostream对象);►④clog:与标准错误输出设备相关联的缓冲方式的标准输出流(ostream对象)。1214.2.2文件流►1.文件的概念►程序常常需要将一些数据信息(如运行结果)永久性地保存下来,或者从永久性信息中读取有用的数据(如历史记录),这些都需要进行文件操作。C++文件操作是通过文件流实现的。►文件是指存放在磁盘上数据的集合。操作系统以文件为单位对这些数据进行管理。也就是说,如果想得到存在磁盘上的数据,必须先按文件名找到指定的文件,然后再从该文件中读取数据。要向磁盘上存放数据也必须先以文件名为标识创建建一个文件,才能向它输出数据。1314.2.2文件流►文件按数据的组织形式可以分为两类:►(1)ASCII文本文件►文本(text)文件对于ASCII字符集而言,文件中每个字节存放的是一个ASCII码,表示一个字符;对于像汉字、日韩文字等字符集而言,使用双字节存放字符。►(2)二进制文件►二进制文件是将数据以内存中的存储形式直接存放到磁盘上。用二进制形式输出数据,可以节省存储空间和避免编码转换。由于一个字节并不对应一个字符,所以不能直接打印输出或编辑二进制文件。1414.2.2文件流►2.文件打开►已创建的文件流对象需要和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件,这个过程称为文件打开。►打开文件有两种方式:一是定义文件流对象时使用带参数的构造函数;二是调用文件流成员函数open。其函数原型如下:1514.2.2文件流►文件打开-函数原型如下:ifstream();//文件输入流构造函数//文件输入流构造函数,用指定的mode方式打开filename文件ifstream(constchar*filename,ios_base::openmodemode=ios_base::in);ofstream();//文件输出流构造函数//文件输出流构造函数,用指定的mode方式打开filename文件ofstream(constchar*filename,ios_base::openmodemode=ios_base::out);fstream();//文件输入输出流构造函数//文件输入输出流构造函数,用指定的mode方式打开filename文件fstream(constchar*filename,ios_base::openmodemode=ios_base::in|ios_base::out);//用指定的mode方式打开filename文件voidopen(constchar*filename,ios_base::openmodemode=ios_base::in);booloperator!();//检测流对象是否为空boolis_open();//检测文件是否打开1614.2.2文件流表14-2打开方式openmode取值含义作用ios_base::ininput以输入(读)方式打开文件(默认方式)ios_base::outoutput以输出(写)方式打开文件。若已存在该文件,则将其内容全部清空ios_base::appappend以输出方式打开文件,写入的数据添加在文件末尾ios_base::ateatend打开一个已有的文件,文件指针指向文件末尾ios_base::binarybinary二进制文件,默认为ASCII文件ios_base::trunctruncate打开一个文件,若文件己存在,则将其内容全部清空;若文件不存在,则建立新文件。若指定了ios::out方式而未指定ios::app、ios::ate、ios::in时,默认为此方式1714.2.2文件流►说明:►(1)可以用位或运算(|)对openmode进行组合。►(2)打开文件时操作可能会失败,如果打开操作失败,open函数返回值为0(假),如果是调用构造函数打开文件的,则流对象的值为0(空对象)。可以据此测试打开是否成功,确定能否对该文件继续操作。►(3)每一个打开的文件都有一个文件指针,该指针初始位置要么在文件末尾(当指定ios_base::app或ios_base::ate时),要么在文件开头。每次读写都从文件指针的当前位置开始。每读写一个字节,指针就后移一个字节。当文件指针移到最后,就会遇到文件结束EOF(文件结束符)。1814.2.2文件流►3.文件关闭►当不再使用文件时,应该关闭该文件。关闭文件可以调用文件流成员函数:►当文件关闭后,就不能再通过流对象对文件进行操作了,除非再次打开。voidclose();//关闭文件1914.2.2文件流►4.文件状态►文件流提供如下四个成员函数用来检测文件状态:►如果文件已到末尾,eof函数返回真(1),否则返回假(0)。如果在读写文件过程中出错,bad函数返回true。如对一个不是为写状态打开的文件进行写入,或者要写入的设备没有剩余空间。除了与bad函数同样的情况下会返回true以外,格式错误时fail函数也会返回true。►如果调用以上任何一个函数返回true的话,good函数函数返回false。booleof();boolbad();boolfail();boolgood();2014.2.2文件流►5.文件操作的基本形式►几乎所有文件应用中的打开和关闭的程序形式是相同的,为此给出通用的文件打开和关闭的操作步骤:►①定义文件流对象;►②通过构造函数或者成员函数open打开文件(或创建文件);►③打开文件失败时中断文件处理;►④对文件进行各种操作;►⑤文件处理结束时关闭文件。2114.2.2文件流►5.文件操作的基本形式---代码形式ifstreaminfile(文件名,openmode);//打开文件或创建文件if(!infile){//打开或创建成功继续操作…//文件读写操作infile.close();//处理结束时关闭文件}或ifstreaminfile;infile.open(文件名,openmode);//打开文件或创建文件if(!infile.fail()){//打开或创建成功继续操作…//文件读写操作infile.close();//处理结束时关闭文件}2214.2.2文件流►文件操作包括读写和定位,除流提取和流插入运算符外,文件流还有如下有用的操作文件的成员函数://用于文件输入流istream&read(char*s,streamsizen);//从文件中读n个字节到sstreampostellg();//返回文件指针的位置istream&seekg(streampospos);//移动文件指针到pos位置istream&seekg(streamoffoff,ios_base::seekdirdir);//以dir参照off偏移移动文件指针//用于文件输出流ostream&write(constchar*s,streamsizen);//输出s的n个字节到文件streampostellp();//返回文件指针的位置ostream&seekp(streampospos);//移动文件指针到pos位置ostream&seekp(streamoffoff,ios_base::seekdirdir);//以dir参照off偏移移动文件指针flush();//文件输出流刷新2314.2.2文件流►6.文件操作举例►(1)对ASCII文件操作。►对ASCII文件的读写操作可以用以下两种方法:►①用流插入()运算符和流提取()运算符输入输出标准类型的数据;►②用第3章3.2节介绍的流对象成员函数get、getline、put等进行字符的输人输出。►例14.1:将源文件每行文本前添加一个行号输出到目的文件中。2414.2.2文件流——例14.11#includefstream//使用文件流2#includeiomanip3usingnamespacestd;//文件流定义在std命名空间4intmain()5{6chars1[5
本文标题:第14章_文件
链接地址:https://www.777doc.com/doc-3352301 .html