《第11章流类库与输入输出.ppt》由会员分享,可在线阅读,更多相关《第11章流类库与输入输出.ppt(78页珍藏版)》请在三一文库上搜索。
1、第11章 流类库与输入/输出,C+语言程序设计,本章主要内容,I/O流的概念 输出流 输入流 输入/输出流,I/O流的概念,当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。 程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。 读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。,I/O流的概念,参见教材P371图11-1 I/O流类层次图 中的流由相应的类创建,并通过相应的方法操作。 i
2、os类是虚基类,派生出istream类和ostream类。,I/O流的概念,istream类是通用输入流类和其它输入流的基类,负责创建输入流,其中定义了输入运算符“”的各种重载形式,它还包括一些更传统的语句如get( )和read( )。 istream的派生类ifstream类负责处理文件的输入,istrstream类负责处理字符串,istream_withassign类创建了标准输入对象cin。,I/O流的概念,相对应地,ostream类是通用输出流类和其它输出流类的基类,定义了输出运算符“”的各种重载形式。 ostream的派生类ofstream类负责处理文件,ostrstream负责处
3、理字符串,ostream_withassign创建了标准输出对象cout、标准错误输出cerr和clog(cerr的缓冲形式)。,I/O流的概念,iostream类是由istream类和ostream类派生的,负责创建输入输出流。,输出流,重要的三个输出流是 ostream ofstream ostrstream。,输出流对象,通过派生类ostream_withassign支持预先定义的流对象: cout 标准输出 cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。 clog 类似于cerr,但是有缓冲,缓冲区满时被输出。,输出流,输出流对象,ofstream类支持磁盘文件输出 构造
4、一个ofstream类的对象。在打开文件之前或之后可以指定ofstream对象接受二进制或文本模式数据。,输出流,输出流对象,如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的 ofstream myFile(“filename“,iosmode);,输出流,存取模式标志位(iosmode),输出流对象,可以在调用缺省构造函数之后使用open成员函数打开文件 ofstream myFile; /声明一个静态输出文件流对象 myFile.open(“filename“,iosmode); /打开文件,使流对象与文件建立联系 ofstream* pmyFile = new ofst
5、ream; /建立一个动态的输出文件流对象 pmyFile-open(“filename“,iosmode); /打开文件,使流对象与文件建立联系,输出流,输出流对象,在一个由文件指示符标识的打开文 件基础上构造一个ofstream对象。 int fd = open(“filename“,dosmode); ofstream myFile1(fd); / Buffered mode(default) ofstream myFile2(fd,NULL,0); / Unbuffered mode,输出流,插入运算符(),插入()运算符是所有标准C+数据类型预先设计的。 用于传送字节到一个输出流对象
6、。,输出流,控制输出格式,控制输出宽度 为了调整输出,可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度。,输出流,转换基控制算子,流格式带参数操作算子(1),流格式带参数操作算子(2),流格式带参数操作算子,ios流格式操作函数,ios类中几个重要的格式控制函数,fmtflags ios:flags(fmtflags newflags); fmtflags ios:setf(fmtflags ored_flag); fmtflags ios:unsetf(fmtflags clear_flag); fmtflags ios:setf(fmtflags bits, f
7、mtflags field);,输出流,ios类中几个重要的格式控制函数,ios:setf有两个版本,分别对应着不同的标志。如果想知道应该使用哪个重载版本,就应该知道正要改变的是哪一类标志。 这里的格式化标志分为两类: 第一类是简单的on/off,对于它们,使用setf()则打开,使用unsetf()则关闭。,输出流,on/off类型标志,ios类中几个重要的格式控制函数,第二类格式化标志分为不同的组。一组中,一次只能一个标志起作用,就如同单选题一样。,输出流,ios:basefield组标志,ios:floatfield组标志,ios:adjustfield组标志,ios类中几个重要的格式控
8、制函数,使用ios操作函数一般都需要单独一行,不能嵌入流中,这使其灵活性受到了一定的影响。为了摆脱这种笨拙的控制方式,可以使用setiosflags()算子和resetiosflags()算子。 见程序:C11_7.cpp,输出流,基本输入操作,见程序:C11_9.cpp 见程序:C11_10.cpp 见程序:C11_11.cpp 见程序:C11_12.cpp,输入流,输入控制格式,见程序:C11_13.cpp,输入流,存取模式标志位(iosmode),文件的读写,见程序:C11_14.cpp 见程序:C11_15.cpp 见程序:C11_16.cpp,文件的随机读写,在一般情况下,以读方式打
9、开文件时,文件指针总是指向文件的开头;以写方式打开文件时,文件指针总是指向文件的结尾。当读文件时,每读一个字节,文件指针就向后移动一个字符的位置;写文件时,每写一个字符后,文件指针就移动到文件的尾部。这种文件指针的移动方式显得非常被动。为了增加对文件访问的灵活性,C+的istream类和ostream类中定义了一些在输入输出流中操作文件指针的成员函数,使编程者可以方便地操纵文件指针。,文件的随机读写,一个文件实际上有两个指针,一个用于读,一个用于写。因此,函数分为对应于istream类和ostream类的两套版本。 这些操纵指针的函数可以分为3类: 文件指针相对移动函数 文件指针定位函数 文件
10、指针绝对移动函数,文件的随机读写,在istream类和ostream类中分别定义了不同的相对指针移动函数seekg()和seekp()。它们的定义如下: istream,文件指针相对移动函数,文件的随机读写,参数dir是文件指针相对移动的参照位置,如下表所列,共有3种情况,在ios中被定义为一个枚举类型seek_dir。,文件指针相对移动函数,文件的随机读写,参数off是相对于参照位置的偏移量,其值为正就是往文件尾部移动,为负就是往文件头部移动。Off被定义为streamoff类型,实际上就是long类型。,文件指针相对移动函数,文件的随机读写,例如: infile.seekg(3, ios:
11、cur) / 文件指针从当前位置向文件尾部移动3个字节 infile.seekg(-5, ios:end) / 文件指针从文件尾部向文件头部移动3个字节 outfile.seekp(0, ios:beg) / 文件指针移到文件头部,文件指针相对移动函数,文件的随机读写,对应于istream类和ostream类的指针定位函数分别是tellg()和tellp()。其定义如下: streampos istream:tellg(); streampos ostream:tellp(); 它们返回文件指针的当前位置,返回类型为streampos。同streamoff一样,streampos等同于long
12、类型。,文件指针定位函数,文件的随机读写,streampos inpos, outpos; inpos = infile.tellg(); / 返回文件infile的当前文件指针位置 outpos = outfile.tellp(); / 返回文件outfile的当前文件指针位置,文件指针定位函数,文件的随机读写,文件指针的绝对移动函数将指针移动到指定的绝对地址上。对应于istream类和ostream类的成员函数也是seekg()和seekp()。但是它们只有一个参数: istream,文件指针绝对移动函数,文件的随机读写,参数pos通常由文件指针定位函数tellg()或tellp()指定。
13、例如: streampos inpos; inpos = infile.tellg(); Infile.seekg(inpos);,文件指针绝对移动函数,文件的随机读写,见程序:C11_17.cpp,例11-1 使用width控制输出宽度,#include void main( ) double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout valuesi n; ,输出流,输出结果是: 1.23 35.36 653.7 4358.24,#include void main( ) double
14、 values = 1.23,35.36,653.7,4358.24; for(int i=0; i4; i+) cout.width(10); cout.fill(*); cout valuesi n; ,输出结果如下: *1.23 *35.36 *653.7 *4358.24,例11-2 使用setw指定宽度,#include #include void main( ) double values = 1.23,35.36,653.7,4358.24; char *names = “Zoot“, “Jimmy“, “Al“, “Stan“; for (int i=0;i4;i+) cout
15、 setw(6) namesi setw(10) valuesi endl; ,输出流,运行结果如下: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,例11-3 设置对齐方式,#include #include void main( ) double values = 1.23,35.36,653.7,4358.24; char *names = “Zoot“, “Jimmy“, “Al“, “Stan“;,输出流,for (int i=0;i4;i+) cout setiosflags(ios:left) setw(6) namesi resetio
16、sflags(ios:left) setw(10) valuesi endl; 输出结果如下: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,例11-4 控制输出精度,#include #include void main( ) double values = 1.23,35.36,653.7,4358.24; char *names = “Zoot“, “Jimmy“, “Al“, “Stan“; cout setiosflags(ios:scientific);,输出流,for (int i=0;i4;i+) cout setiosflags(io
17、s:left) setw(6) namesi resetiosflags(ios:left) setw(10) setprecision(1) valuesi endl; 该程序的输出结果如下: Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003,进制,dec、oct和hex操纵符设置输入和输出的缺省进制。,输出流,输出文件流成员函数,输出流成员函数有三种类型: 与操纵符等价的成员函数。 执行非格式化写操作的成员函数。 其它修改流状态且不同于操纵符或插入运算符的成员函数。,输出流,输出文件流成员函数,open函数 把流与一个特定的磁盘文件关联起来。 需要指定打开
18、模式。 put函数 把一个字符写到输出流中。 write函数 把内存中的一块内容写到一个输出文件流中 seekp和tellp函数 操作文件流的内部指针 close函数 关闭与一个输出文件流关联的磁盘文件 错误处理函数 在写到一个流时进行错误处理,输出流,例11-5 向文件输出,#include struct Date int mo,da,yr; ; void main( ) Date dt = 6,10,92; ofstream tfile(“date.dat“,ios:binary); tfile.write(char *) ,输出流,二进制输出文件,以通常方式构造一个流,然后使用setmo
19、de成员函数,在文件打开后改变模式。 使用ofstream构造函数中的模式参量指定二进制输出模式 使用二进制操作符代替setmode成员函数:ofs binary;,输出流,输入流,重要的输入流类: istream类最适合用于顺序文本模式输入。 cin是其派生类istream_withassign的对象。 ifstream类支持磁盘文件输入。,输入流对象,如果在构造函数中指定一个文件名,在构造该对象时该文件便自动打开。 ifstream myFile(“filename“,iosmode); 在调用缺省构造函数之后使用open函数来打开文件。 ifstream myFile; / 建立一个文件
20、流对象 myFile.open(“filename“,iosmode); /打开文件“filename“,输入流,提取运算符(),提取运算符()对于所有标准C+数据类型都是预先设计好的。 是从一个输入流对象获取字节最容易的方法。 ios类中的很多操纵符都可以应用于输入流。但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符dec、oct和hex。,输入流,输入流成员函数,open函数把该流与一个特定磁盘文件相关联。 get函数的功能与提取运算符()很相像,主要的不同点是get函数在读入数据时包括空白字符。 getline的功能是从输入流中读取多个字符,并且允许指定输入终止字符,读
21、取完成后,从读取的内容中删除终止字符。,输入流,例11-6 get函数应用举例,#include void main() char ch; while (ch=cin.get()!=EOF) cout.put(ch); ,输入流,例11-7 为输入流指定一个终止字符,#include void main() char line100; cout “Type a line terminated by t “ endl; cin.getline(line,100,t); cout line; ,输入流,输入流成员函数,read成员函数从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数
22、。 如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取。,输入流,例11-8 从文件读二进制记录,#include #include #include void main( ) struct double salary; char name23; employee;,输入流,ifstream is(“payroll“,ios:binary |ios:nocreate); if (is) is.read(char *) ,输入流成员函数,seekg函数用来设置输入文件流中读取数据位置的指针。 tellg函数返回当前文件读指针的位置。 close函数关闭与一个输入文
23、件流关联的磁盘文件。,输入流,例11-9 设置位置指针,#include void main( ) char ch; ifstream tfile(“payroll“,ios:binary | ios:nocreate); if(tfile) tfile.seekg(8);,输入流,while (tfile.good( )) tfile.get(ch); if (!ch) break; cout ch; else cout “ERROR: Cannot open file payroll.“ endl; ,例11-10 读文件并显示其中空格的位置,#include void main( ) c
24、har ch; ifstream tfile(“payroll“,ios:binary | ios:nocreate); if (tfile) ,输入流,while (tfile.good( )) streampos here = tfile.tellg( ); tfile.get(ch); if (ch= ) cout “nPosition “ here “ is a space“; else cout “ERROR: Cannot open file payroll.“ endl; ,小结,第13讲 流类库与输入/输出 本讲内容: 流类库 C+语言没有输入/输出语句,但是C+编译系统带有一
25、个面向对象的I/O软件包,即:I/O流类库。 最重要的三个输出流类 ostream、ofstream 和 ostrstream 最重要的三个输入流类 istream、ifstream 和 istrstream,小结(续),第13讲 流类库与输入/输出 本讲内容: 参见:第13讲要点 两个从iostream类派生出来的重要的I/O流类 fstream 和 strstream,自修作业(不用交),复习第11章,预习第12章 思考: 11-1 11-6 自检作业: 11-7 11-9 实验十一 自检作业就是:自己先做一遍,然后对照C+语言程序设计(第3版)学生用书一书中给出的答案,找出自己学习中的薄弱环节。这个作业不用交。,作业(一周之内必须交),1、第11章书面作业 2、第11章编程作业 将书面作业(*.doc)文件和编程作业(*.cpp)文件以附件形式通过电子邮件发给温老师。注意:在电子邮件主题上要写明你的姓名和学号以及第几章的作业。,
链接地址:https://www.31doc.com/p-2250860.html