




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022年3月22日3时06分12022年3月22日3时06分第第13章章C+流流和文件和文件 13.1流抽象的继承结构 13.2预定义的插入符与提取符 13.3插入符与提取符的重载 13.4格式控制符的操作 13.5磁盘文件的输入和输出 13.6字符串流I/O流的概念流的概念1、流的引入 scanf(%d,&a); cina; printf(%d,a); couta;2、流的基本概念 流:数据从一个对象流动到另一个对象,这种 流动抽象为流。 流的操作:建立流、删除流、提取(读操作/输 入)、插入(写操作/输出)。ios:对流状态进行设置,虚基类;streambuf:提供对数据的缓冲支
2、持;istream、ostream、iostream:提取与插入3、C+流的继承结构iosstreambufistreamostreamiostream4、文件的继承结构fstreambasefilebufifstreamofstreamiofstream5、字符串类提供处理内部初始化字符序列的操作;istrstream:从序列中取字符;ostrstream:将字符放入序列;6、预定义的流cin:istream类对象,处理标准输入,即键盘输入;cout:ostream类对象,处理标准输出,即屏幕输出;cerr:ostream类对象,处理标准出错信息,提供不 带缓冲区的输出;clog:ostre
3、am类对象,处理标准出错信息,提供带 缓冲区的输出;预定义的插入符预定义的插入符1、预定义插入符的格式ostream& ostream:operator (const type& obj);其中:type为char、int、short、long类型和它们的unsigned和signed类型,以及float、double、long double、char *和void *;2、说明一般情况下将插入符作用于cout对象; 输出语句中可以串联多个插入运算符,输出多个数据项; 插入运算符后可以是任意复杂的表达式,系统可自动计算其值并传给插入符; 指针类型的地址值,默认为十六进制显示,用
4、long强制转换后才可以十进制显示; 字符指针的地址值的输出格式为:(void *)s或void *(s),此时仍为十六进制格式;例1分析下列程序的输出结果。#include #include void main() char *str=Hello; int a=100; int *pa=&a; cout*pa=*paendl; cout&pa=&pa or long(&pa)endl; coutThe string is strendl; coutThe address is (void *)str or long(void *)str)endl;字符串字符串
5、首地址地址值的十六进制表示方法地址值的十进制表示方法输出结果:*pa=100&pa=0 x0065FDEC or 6684144The string is HelloThe address is 0 x00426064 or 43500523、使用put()输出一个字符ostream& ostream:put(char c);4、使用write()输出n个字符ostream& ostream:write(char *buf,int n);说明:说明:这些成员函数既可用于文本流,也可用于二进制流,尤其适用于二进制流;例2分析下列程序的输出结果。#include void
6、main() couta, bn; cout.put(a).put(, ).put(b).put(n); char c1=A,c2=B; cout.put(c1).put(c2).put(n);输出a,ba,bAB例3分析下列程序的输出结果。#include #include void PrintString(char *s) cout.write(s,strlen(s).put(n); cout.write(s,6)n;void main() char str=I love you?; coutThe string is: str(type& obj);其中:type为char、in
7、t、short、long类型和它们的unsigned和signed类型,以及float、double、long double、char *;2、说明一般情况下将提取符作用于cin对象; 输入语句中可以串联多个提取运算符,每个提取符后为一表达式,该表达式是获得输入值的变量或对象; 提取操作时,空白符(空格、tab键、换行符)只用于字符的分隔符,而本身不作为从输入流中提取的字符; 提取符可从输入流中读取一个字符串,该字符串是以空白符结束的一个字符序列,由系统自动加上0字符;2022年3月22日3时06分17例例4:分析下列程序的输出结果:分析下列程序的输出结果#include #include v
8、oid main() const int SIZE=20; char bufSIZE; char *largest; int curLen,maxLen=-1,cnt=0; coutInput words:buf) curLen=strlen(buf); cnt+; if(curLenmaxLen) 2022年3月22日3时06分18 maxLen=curLen; largest=buf; coutnCount of words:cnt; coutnNumber of longest word:maxLen; coutnThe word is:largestendl;输入Input words
9、: I love you everyone输出?请思考?输入ctrl+z键后,cinbuf的值为0,退出while循环;输入Input words: I love you everyone输出Count of words:4 Number of longest word:8 The word is:everyone输入ctrl+z键后,cinbuf的值为0,退出while循环3、使用get()获取一个字符istream& istream:get(char& c);int istream:get();4、使用getline()获取多个字符istream& istream:
10、getline(char *buf,int Limit,Deline=n);说明:getline()最多可读取Limit-1个字符;从输入流中读取Limit-1个字符后;从输入流中读取换行符或其他终止符后;从输出流中读取到文件或输入流结束符后;getline()通常用来读取一行字符:5、使用read()读取一串字符istream& istream:read(char *,int);getline()函数结束操作的条件:6、辅助操作 int istream:peek();/不输入而返回下一个字符 istream& istream:putback(char *,int);/回放字符
11、 int istream:gcount()/返回上次输入的字符数例5分析下列程序的输出结果。#include void main() char ch; coutInput: ; while(ch=cin.get()!=EOF) cout.put(ch); coutOK! endl;输入abc xyz 123输出abc xyz 123OK!例6分析下列程序的输出结果。#include void main() const int S=80; char bufS=; coutInputendl; cin.read(buf,S); coutendl; coutbufendl;输出 abcdefghij
12、kl输入:Input.abcdefghijkl 1、重载为友元函数ostream& operator(istream&s,type& p);2、函数调用形式ostrmobj;等价于operator (ostrm,obj);ostrmobj1obj2;等价于operator (operatorobj;等价于operator (istrm,obj);istrmobj1obj2;等价于operator (operator(istrm,obj1),obj2);插入符和提取符的重载插入符和提取符的重载例7分析下列程序的输出结果输出Current date: 1131313/10/
13、22Enter new date: 2005 5 27New date: 2005/5/27控制输出格式控制输出格式控制输出宽度1、在流中放入setw操纵符2、调用width成员函数为每个项指定输出宽度例如可使用width控制输出宽度输出结果是: 1.23 35.36 653.7 4358.24cout.fill(*);输出结果是:*1.23*35.36*653.7*4358.24例例8 使用使用width指定宽度指定宽度#include void main()() double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cou
14、t.width(10); cout valuesi n; 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 setw(6) namesi setw(10);cout valuesi endl; 结果如下: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24例例13 使用使用setw控制输出宽度控制输出宽度例例10 设置对齐方式设置对齐方式(P307)#include #inclu
15、de 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 resetiosflags(ios:left)setw(10)valuesiendl;输出结果如下:Zoot 1.23Jimmy 35.36Al 653.7Stan 4358.24例例11 控制输出精度控制输出精度#include #include void main() double val
16、ues = 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(ios:left)setw(6)namesi resetiosflags(ios:left)setw(10)setprecision(1) valuesiendl;Zoot 1Jimmy 4e+001Al 7e+002Stan 4e+003输出结果如下:磁盘文件的输入输出磁盘文件的输入输出1、文件的打开与关闭2、文本文
17、件的读写操作3、二进制文件的读写操作4、随机文件有读写操作1 1、文件的概念、文件的概念在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成文件的基本概念文件的基本概念2 2、文件的类型、文件的类型按存储格式分为两种类型,一种为字符格式文件(文本文件),另一种为内部字节文件(二进制文件)。3 3、文件流对象、文件流对象要用#include命令。它提供的输入文件流类:ifstream输出文件流类:ofstream输入输出文件流类:fstream定义用户所需要的文件流对象,然后利用op
18、en成员函数,按照一定的方式打开一个文件。文件被打通过流对象访问其中内容,结束后用close关闭。文件的打开与关闭文件的打开与关闭流可以分为3类:输入流、输出流以及输入/输出流,相应地必须将流说明为ifstream、ofstream以及fstream类的对象。例如:ifstream ifile; /说明一个输入流对象ofstream ofile; /说明一个输出流对象fstream iofile; /说明一个输入/输出流对象之后用open()来打开文件。即在流与文件之间建立一个连接。open()的函数原型为:void open(const char * filename,int mode,in
19、t prot=filebuf:openprot); 相关参数说明相关参数说明Filename:文件名,它可包含路径说明。Mode:文件打开的模式方式意义ios:in 打开文件进行读操作 ios:out 打开文件进行写操作 ios:ate 打开时文件指针定位到文件尾 ios:app 添加模式,所有增加都在文件尾部ios:trunc 如果文件已存在则清空原文件 ios:nocreate 如果文件不存在则打开失败 ios:binary 二进制文件(非文本文件) 对于ifstream流,mode的默认值为ios:in; 对于ofstream流,mode的默认值为ios:out。ProtProt:文件的
20、访问方式,取值为:0 普通文件1 只读文件 2 隐含文件 4 系统文件mode的符号常量可以“|”组合在一起,如ios:in|ios:binary表示以只读方式打开二进制文件。 文件的读写方法文件的读写方法(1 1)使用流运算符直接读写)使用流运算符直接读写可以直接使用流的“”,完成文件的字符转换工作。(2 2)使用流成员函数)使用流成员函数输出流成员函数为:put函数、write函数输入流成员函数有:get函数、getline函数、read函数例12-Simple:分析下列程序的输出结果。#include #include void main() ofstream ostrm; ostrm.
21、open(C:f1.dat); ostrmMendl; ostrm310.85nd; coutn, dendl; istrm.close();输出:M,310.85文本文件的读写操作文本文件的读写操作例12:将文本写入指定的文件#include #include #include void main() fstream outfile; outfile.open(f2.dat,ios:out); if(!outfile) coutf2.dat cant open. endl; abort(); outfilethis is a program. endl; outfile.close();退出
22、程序要指定具体路径,否则在要指定具体路径,否则在当前目录!当前目录!例13从文本文件中读出信息输出this is a program.例14使用get()和put()函数读写文件this is a c+ program.输出例15将一文件内容拷贝到另一文件由例15思考并设计一个自己的拷贝命令,实现“真正”的COPY功能,如:mycopy c:abc.txt d:123.txtmycopy c:abc.txt d:(不给定文件名)(不给定文件名)即:给定两个参数!要用什么来实现?即:给定两个参数!要用什么来实现?设计设计Mycopy-简单实现简单实现#include #include #incl
23、ude void main(int argc,char *argv) fstream outfile,infile;infile.open(argv1,ios:in);if(!infile) coutOpen file error!n; abort(); outfile.open(argv2,ios:out);if(!outfile) coutOpen file error!n; abort();char ch;while(infile.get(ch)outfile.put(ch);cout=0;j-)/从后往前循环查找,找到就停止if(sourj=)pos=j;break;/从开始往后取出文
24、件名并放入s_temp_filefor(int i=0,k=pos+1;kns;i+,k+) sfilei=sourk; sfilei=0;/一定要截止/如果参数2是完整路径与文件名,则可直接当目标文件使用/否则目标文件名是目标路径源文件名 if(destnd-1!=) /有完整路径及文件名时 strcpy(dfile,argv2);else /只有路径时 for(int i=0;ind;i+) dfilei=desti;/先取出路径 dfilend=0;/一定要截止 strcat(dfile,sfile); /再把路径与源文件名相连成目标文件infile.open(argv1,ios:in)
25、;if(!infile) coutOpen file error!n; abort(); outfile.open(dfile,ios:out);if(!outfile) coutOpen file error!n; abort();char ch;while(infile.get(ch) /coutch; outfile.put(ch);cout1 file(s) copied.n; outfile.close();infile.close();二进制文件的读写操作二进制文件的读写操作用用write()往文件写入往文件写入n个字个字节节原型:ostream& ostream:writ
26、e(char *buf ,int n);写入什么?写入什么?写写n个字节个字节转换成转换成char *用用read()从文件读取从文件读取n个字个字节节原型: istream& istream:read(char *buf, int n);从文件读取到从文件读取到buf中去中去读读n个字节个字节例16对一二进制文件进行读写操作输出Wang1.6525Zhang1.7224Li1.61321Huang1.722struct person char name20; double height; int age;person people6;/假设数组已经赋值假设数组已经赋值outfile.
27、write(char *)&peoplei,sizeof(peoplei);随机访问数据文件随机访问数据文件1、读读文件指针(与get相对,所以有g)istream& istream:seekg(streampos);istream& istream:seekg(streamoff,ios:seek_dir);streampos istream:tellg();/获取当前指针位置streampos为long型;seek_dir的值:cur=1,相对于当前读指针指定的位置;beg=0,相对于流的开始位置;end=2,相对于流的结尾位置;2、写文件指针(与put相对,所以有
28、p)ostream& ostream:seekp(streampos);ostream& ostream:seekp(streamoff,ios:seek_dir);streampos ostream:tellp();举例,随机文件读写操作举例,随机文件读写操作struct student char name20; long number; double totalscore; ;studentstu5=Ma,137001,85.72, Li,137002,132.62, Hu,137003,813.25, Yan,137004,130.84, Lu,137005,80.132
29、;fstream file1;student one;for(int i=0;i5;i+) ;/注意:最前面的记录是第最前面的记录是第0条!条! file1.write(char *)&stui,sizeof(student);/写入到文件file1.seekg(sizeof(student)*4); /定位到第4条记录file1.read(char *)&one,sizeof(student); /把该记录读到one变量中tone.numbert/显示该记录内容 one.totalscoreendl;例17分析下列程序的输出结果输出Lu13700580.132Li137002132.62再举一例,随机文件读写操作再举一例,随机文件读写操作fstream file(f6.dat,ios:in|ios:out|ios:binary);for(int i=0;i5;i+) file.write(char *)&i,sizeof(int);streampos pos=file.tellp();coutCurrent byte number:posendl;for(i=15;i20;i+) file.write(char *)&i,size
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字艺术市场数字化交易平台在艺术品市场中的用户体验提升报告
- 爱好养花面试题及答案
- 施工现场事故案例学习考核题目细解试题及答案
- 废旧塑料回收再利用技术革命2025年产业发展策略分析报告
- 盐业执法考试试题及答案
- 建筑施工安全新技术试题及答案
- 潮玩市场2025年研究报告:收藏价值与文化传播的双重视角解读
- 江苏省句容市崇明片2024-2025学年初三毕业班阶段性测试(七)英语试题含答案
- 智能仓储物流系统智能化改造对人力资源优化影响报告
- 沈阳城市学院《德汉口译》2023-2024学年第二学期期末试卷
- 妊娠期高血压疾病诊治指南2020完整版
- 铜及铜合金物理冶金基础-塑性加工原理
- 2023年自考外国新闻事业史历年考题及部分答案
- 安徽汇宇能源发展有限公司25万吨年石脑油芳构化项目环境影响报告书
- 新《行政处罚法》亮点ppt解读
- LY/T 1970-2011绿化用有机基质
- 部编人教版五年级语文下册第18课《威尼斯的小艇》精美课件
- 消防(电动车)火灾安全知识课件
- VSM(价值流图中文)课件
- 上海交通大学医学院附属仁济医院-日间手术管理信息化实践与发展
- 核电站入厂安全培训课件
评论
0/150
提交评论