《c++流类库与输入输出.ppt》由会员分享,可在线阅读,更多相关《c++流类库与输入输出.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目录11.1 I/O流的概念及流类库结构11.2 输出流11.3 输入流11.4 输入/输出流11.5 小结111.1 I/O流的概念及流类库结构当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。211.2 输出流最重要的三个输出流是ostreamofstreamostringstream4
2、11.2.1 构造输出流对象预先定义的输出流对象:cout 标准输出cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。clog 类似于cerr,但是有缓冲,缓冲区满时被输出。511.2 输出流6标准输出换向ofstream fout(b.out);streambuf*pOld =cout.rdbuf(fout.rdbuf();/cout.rdbuf(pOld);11.2.1 构造输出流对象(续)ofstream类支持磁盘文件输出如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的ofstream myFile(filename);可以在调用默认构造函数之后使用open成
3、员函数打开文件ofstream myFile;/声明一个静态文件输出流对象声明一个静态文件输出流对象myFile.open(filename);/打开文件,使流对象与文件建立联系打开文件,使流对象与文件建立联系在构造对象或用open打开文件时可以指定模式ofstream myFile(filename,ios_base:out|ios_base:binary);711.2 输出流11.2.2使用插入运算符和操纵符(manipulator)插入()运算符是所有标准C+数据类型预先设计的,用于传送字节到一个输出流对象。插入运算符与操纵符一起工作,可以控制输出格式。很多操纵符都定义在ios_base
4、类中(如hex()),和头文件中(如setprecision())。setw和width仅影响紧随其后的域,但其它流格式操纵符保持有效直到发生改变。控制输出宽度为了调整输出,可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度。dec、oct和hex操纵符设置输入和输出的默认进制。811.2 输出流例11-1 使用width控制输出宽度#includeusingnamespacestd;intmain()doublevalues=1.23,35.36,653.7,4358.24;for(inti=0;i4;i+)cout.width(10);coutvaluesiend
5、l;return0;911.2 输出流 11.2.2使用插入运算符和操纵符(manipulator)输出结果输出结果:1.23 1.23 35.36 35.36 653.7 653.7 4358.24 4358.24例11-2使用setw操纵符指定宽度/11_2.cpp#include#include#includeusingnamespacestd;intmain()doublevalues=1.23,35.36,653.7,4358.24;stringnames=Zoot,Jimmy,Al,Stan;for(inti=0;i4;i+)coutsetw(6)namesisetw(10)val
6、uesiendl;return0;1011.2 输出流 11.2.2使用插入运算符和操纵符(manipulator)输出结果输出结果:1.23 1.23 35.36 35.36 653.7 653.7 4358.24 4358.24例11-3设置对齐方式/11_3.cpp#include#include#includeusingnamespacestd;intmain()doublevalues=1.23,35.36,653.7,4358.24;stringnames=Zoot,Jimmy,Al,Stan;for(inti=0;i4;i+)coutsetiosflags(ios_base:le
7、ft)/左对齐setw(6)namesiresetiosflags(ios_base:left)setw(10)valuesiendl;return0;1111.2 输出流 11.2.2使用插入运算符和操纵符(manipulator)输出结果:Zoot1.23Jimmy35.36Al653.7Stan4358.24setiosflags的参数ios_base:skipws 在输入中跳过空白。ios_base:left 左对齐值,用填充字符填充右边。ios_base:right 右对齐值,用填充字符填充左边(缺省对齐方式)。ios_base:internal 在规定的宽度内,指定前缀符号之后,数
8、值之前,插入指定的填充字符。ios_base:dec 以十进制形式格式化数值(缺省进制)。ios_base:oct 以八进制形式格式化数值。ios_base:hex 以十六进制形式格式化数值。ios_base:showbase 插入前缀符号以表明整数的数制。ios_base:showpoint 对浮点数值显示小数点和尾部的0。ios_base:uppercase 对于十六进制数值显示大写字母A到F,对于科学格式显示大写字母E。ios_base:showpos 对于非负数显示正号(“+”)。ios_base:scientific 以科学格式显示浮点数值。ios_base:fixed 以定点格式显
9、示浮点数值(没有指数部分)。ios_base:unitbuf 在每次插入之后转储并清除缓冲区内容。1211.2 输出流 11.2.2使用插入运算符和操纵符(manipulator)例11-4控制输出精度/11_4.cpp#include#include#includeusingnamespacestd;intmain()doublevalues=1.23,35.36,653.7,4358.24;stringnames=Zoot,Jimmy,Al,Stan;for(inti=0;i4;i+)coutsetiosflags(ios_base:left)setw(6)namesiresetiosfl
10、ags(ios_base:left)/清除左对齐设置setw(10)setprecision(1)valuesiendl;return0;1311.2 输出流 11.2.2使用插入运算符和操纵符(manipulator)输出结果:Zoot1Jimmy4e+001Al7e+002Stan4e+00311.2.3文件输出流成员函数输出流成员函数有三种类型:与操纵符等价的成员函数。执行非格式化写操作的成员函数。其它修改流状态且不同于操纵符或插入运算符的成员函数。1411.2 输出流11.2.3文件输出流成员函数(续)open函数把流与一个特定的磁盘文件关联起来。需要指定打开模式。put函数把一个字符
11、写到输出流中。write函数把内存中的一块内容写到一个文件输出流中seekp和tellp函数操作文件流的内部指针close函数关闭与一个文件输出流关联的磁盘文件错误处理函数在写到一个流时进行错误处理1511.2 输出流例11-5 向文件输出/11_5.cpp#includeusingnamespacestd;structDateintmon,day,year;intmain()Datedt=6,10,92;ofstreamfile(date.dat,ios_base:binary);file.write(reinterpret_cast(&dt),sizeof(dt);file.close()
12、;return0;1611.2 输出流 11.2.3 文件输出流成员函数11.2.4 二进制输出文件以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式。使用ofstream构造函数中的模式参量指定二进制输出模式1711.2 输出流11.2.5 字符串输出流(ostringstream)用于构造字符串功能支持ofstream类的除open、close外的所有操作str函数可以返回当前已构造的字符串典型应用将数值转换为字符串1811.2 输出流例11-6用ostringstream将数值转换为字符串/11_6.cpp#include#include#includeusing
13、namespacestd;templateinlinestringtoString(constT&v)ostringstreamos;/创建字符串输出流osv;/将变量v的值写入字符串流returnos.str();/返回输出流生成的字符串intmain()stringstr1=toString(5);coutstr1endl;stringstr2=toString(1.2);coutstr2endl;return0;1911.2 输出流 11.2.5 字符串输出流(ostringstream)输出结果:51.2函数模板toString可以把各种支持“)对于所有标准C+数据类型都是预先设计好的
14、。是从一个输入流对象获取字节最容易的方法。ios类中的很多操纵符都可以应用于输入流。但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符dec、oct和hex。2211.3 输入流11.3.4输入流相关函数open函数把该流与一个特定磁盘文件相关联。get函数的功能与提取运算符()很相像,主要的不同点是get函数在读入数据时包括空白字符。(第6章介绍过)getline的功能是从输入流中读取多个字符,并且允许指定输入终止字符,读取完成后,从读取的内容中删除终止字符。(第6章介绍过)read成员函数从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数。如果给出长度参数,当
15、遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取。2311.3 输入流11.3.4输入流相关函数(续)seekg函数用来设置文件输入流中读取数据位置的指针。tellg函数返回当前文件读指针的位置。close函数关闭与一个文件输入流关联的磁盘文件。2411.3 输入流例11-7 get函数应用举例/11_7.cpp#includeusingnamespacestd;intmain()charch;while(ch=cin.get()!=EOF)cout.put(ch);return0;2511.3 输入流 11.3.4 输入流相关函数例11-8为输入流指定一个终止字符:/11_8.
16、cpp#include#includeusingnamespacestd;intmain()stringline;coutTypealineterminatedbytendl;getline(cin,line,t);coutlineendl;return0;2611.3 输入流 11.3.4 输入流相关函数例11-9从一个payroll文件读一个二进制记录到一个结构中/11_9.cpp#include#include#includeusingnamespacestd;structSalaryInfounsignedid;doublesalary;intmain()SalaryInfoemplo
17、yee1=600001,8000;ofstreamos(payroll,ios_base:out|ios_base:binary);os.write(reinterpret_cast(&employee1),sizeof(employee1);os.close();2711.3 输入流 11.3.4 输入流相关函数例11-9(续)ifstreamis(payroll,ios_base:in|ios_base:binary);if(is)SalaryInfoemployee2;is.read(reinterpret_cast(&employee2),sizeof(employee2);coute
18、mployee2.idemployee2.salaryendl;elsecoutERROR:Cannotopenfilepayroll.endl;is.close();return0;2811.3 输入流 11.3.4 输入流相关函数例11-10用seekg函数设置位置指针/11_10.cpp,头部分省略intmain()intvalues=3,7,0,5,4;ofstreamos(integers,ios_base:out|ios_base:binary);os.write(reinterpret_cast(values),sizeof(values);os.close();ifstream
19、is(integers,ios_base:in|ios_base:binary);if(is)is.seekg(3*sizeof(int);intv;is.read(reinterpret_cast(&v),sizeof(int);coutThe4thintegerinthefileintegersisvendl;elsecoutERROR:Cannotopenfileintegers.endl;return0;2911.3 输入流 11.3.4 输入流相关函数例11-11读一个文件并显示出其中0元素的位置/11_11.cpp,头部分省略intmain()ifstreamfile(intege
20、rs,ios_base:in|ios_base:binary);if(file)while(file)/读到文件尾file为0streamposhere=file.tellg();intv;file.read(reinterpret_cast(&v),sizeof(int);if(file&v=0)coutPositionhereis0endl;elsecoutERROR:Cannotopenfileintegers.endl;file.close();return0;3011.3 输入流 11.3.4 输入流相关函数11.3.5 字符串输入流(istringstream)用于从字符串读取数据
21、在构造函数中设置要读取的字符串功能支持ifstream类的除open、close外的所有操作典型应用将字符串转换为数值3111.3 输入流例11-12用ostringstream将字符串转换为数值/11_12.cpp,头部分省略templateinlineTfromString(conststring&str)istringstreamis(str);/创建字符串输入流Tv;isv;/从字符串输入流中读取变量vreturnv;/返回变量vintmain()intv1=fromString(5);coutv1endl;doublev2=fromString(1.2);coutv2endl;return0;3211.3 输入流 11.3.5 字符串输入流(istringstream)11.4 输入/输出流一个iostream对象可以是数据的源或目的。两个重要的I/O流类都是从iostream派生的,它们是fstream和stringstream。这些类继承了前面描述的istream和ostream类的功能。3311.7 小结主要内容I/O流的概念、输出流、输入流、输入/输出流。达到的目标理解I/O流的概念,学会使用I/O流类库实现文件输入/输出及格式控制。34