版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计,主讲人:谢昕 华东交通大学信息工程学院,2008年春季学期,第16-17讲 C+的I/O流库,流抽象的继承结构 预定义的插入符与提取符 插入符和提取符的重载 格式控制符的操作 磁盘文件的输入和输出 字符串流,主要内容,I/O流的概念,1、流的引入 scanf(%d, 2、流的基本概念 流:数据从一个对象流动到另一个对象,这种 流动抽象为流。 流的操作:建立流、删除流、提取(读操作/输 入)、插入(写操作/输出)。,ios:对流状态进行设置,虚基类; streambuf:提供对数据的缓冲支持; istream、ostream、iostream:提取与插入,3、C+流的继承结构,I/
2、O流的概念,4、文件的继承结构,I/O流的概念,5、字符串类,提供处理内部初始化字符序列的操作;,istrstream:从序列中取字符;,ostrstream:将字符放入序列;,I/O流的概念,6、预定义的流,cin:istream类对象,处理标准输入,即键盘输入;,cout:ostream类对象,处理标准输出,即屏幕输出;,cerr:ostream类对象,处理标准出错信息,提供不 带缓冲区的输出;,clog:ostream类对象,处理标准出错信息,提供带 缓冲区的输出;,I/O流的概念,预定义的插入符,1、预定义插入符的格式,ostream,其中:type为char、int、short、lo
3、ng类型和它们的unsigned和signed类型,以及float、double、long double、char *和void *;,2、说明,一般情况下将插入符作用于cout对象;输出语句中可以串联多个插入运算符,输出多个数据项;,例1分析下列程序的输出结果。,void main() char *str=Hello; int a=100; int *pa= ,输出结果:,*pa=100 cout.put(a).put(, ).put(b).put(n); char c1=A,c2=B; cout.put(c1).put(c2).put(n); ,例3分析下列程序的输出结果。,void Pr
4、intString(char *s) cout.write(s,strlen(s).put(n); cout.write(s,6)n; void main() char str=I love you?; coutThe string is: strendl; PrintString(str); PrintString(this is a string); ,The string is: I love you? I love you? I love this is a string this i,预定义的提取符,1、预定义提取符的格式,istream,2、说明,一般情况下将提取符作用于cin对象
5、;输入语句中可以串联多个提取运算符,每个提取符后为一表达式,该表达式是获得输入值的变量或对象;,提取操作时,空白符(空格、tab键、换行符)只用于字符的分隔符,而本身不作为从输入流中提取的字符;,提取符可从输入流中读取一个字符串,该字符串是以空白符结束的一个字符序列,由系统自动加上0字符;,预定义的提取符,例4:分析下列程序的输出结果,void main() const int SIZE=20; char bufSIZE; char *largest; int curLen,maxLen=-1,cnt=0; coutbuf) curLen=strlen(buf); cnt+; if(curLe
6、nmaxLen) ,maxLen=curLen; largest=buf; coutnCount of words:cnt; coutnNumber of longest word:maxLen; coutnThe word is:largestendl; ,输 入,Input words: 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 wo
7、rd is:everyone,输入ctrl+z键后,cinbuf 的值为0,退出while循环,3、使用get( )获取一个字符,istream,4、使用getline( )获取多个字符,istream,getline( )最多可读取Limit-1个字符;,预定义的提取符,从输入流中读取Limit-1个字符后; 从输入流中读取换行符或其他终止符后; 从输出流中读取到文件或输入流结束符后; getline( )通常用来读取一行字符:,getline( )函数结束操作的条件:,预定义的提取符,5、使用read( )读取一串字符,istream,6、辅助操作,int istream:peek( );
8、/不输入而返回下一个字符 istream/回放字符 int istream:gcount( )/返回上次输入的字符数,预定义的提取符,例5分析下列程序的输出结果。,void main( ) char ch; coutInput: ; while(ch=cin.get()!=EOF) cout.put(ch); coutok! endl; ,输入,abc xyz 123,输出,abc xyz 123 ok!,例6分析下列程序的输出结果。,void main() const int S=80; char bufS=; coutInputendl; cin.read(buf,S); coutendl
9、; coutbufendl; ,输出,abcd efgh ijkl,输入: Input. abcd efgh ijkl ,1、重载为友元函数,ostream,2、函数调用形式,ostrmobj; 等价于operator (ostrm,obj);,ostrmobj1obj2; 等价于operator (operator(ostrm,obj1),obj2);,插入符和提取符的重载,例7分析下列程序的输出结果,输 出,Current date: 1999/10/22 Enter new date: 2005 5 27 New date: 2005/5/27,控制输出格式,控制输出宽度 1、在流中放入
10、setw操纵符 2、调用width成员函数为每个项指定输出宽度,例如可使用width控制输出宽度,1.23 35.36 653.7 4358.24,cout.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+) cout.width(10); cout valuesi n; ,void main() double values = 1.23,35.36,653.7,4358.24
11、; 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,例9 使用setw控制输出宽度,例10 设置对齐方式,#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+)
12、cout setiosflags(ios:left)setw(6) namesi resetiosflags(ios:left) setw(10)valuesiendl; ,Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,例11 控制输出精度,#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
13、 setiosflags(ios:left)setw(6)namesi resetiosflags(ios:left)setw(10) setprecision(1) valuesiendl; ,Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003,磁盘文件的输入输出,文件的打开与关闭 文本文件的读写操作 二进制文件的读写操作 随机文件有读写操作,1、文件的概念 在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成,2、文件的类型 按存储格式分为两种类
14、型,一种为字符格式文件(文本文件),另一种为内部字节文件(二进制文件)。,-文件的基本概念,3、文件流对象 要用#include命令。 它提供的输入文件流类:ifstream 输出文件流类:ofstream 输入输出文件流类:fstream 定义用户所需要的文件流对象,然后利用open成员函数,按照一定的方式打开一个文件。文件打开后通过流对象访问其中内容,结束后用close关闭。,-文件的基本概念,文件的打开与关闭,流可以分为3类:输入流、输出流以及I/O流,相应地必须将流说明为ifstream、ofstream以及fstream类的对象。 例如: ifstream ifile; /说明一个输
15、入流对象 ofstream ofile; /说明一个输出流对象 fstream iofile; /说明一个输入/输出流对象,文件的打开与关闭,可用open( )来打开文件。即在流与文件之间建立一个连接。Open( )的函数原型为: void open(const char * filename, int mode,int prot=filebuf:openprot);,Filename:文件名,它可包含路径说明; Mode:文件打开的模式; Prot:文件的访问方式。取值为0 :普通文件; 1 :只读文件;2:隐含文件 ;4:系统文件,相关参数说明,文件的打开与关闭,对于ifstream流,m
16、ode的默认值为ios:in; 对于ofstream流,mode的默认值为ios:out。,mode的符号常量可以|组合在一起,如ios:in|ios:binary 表示以只读方式打开二进制文件。,文件的打开与关闭,文件的读写方法,(1)使用流运算符直接读写 可以直接使用流的,完成文件的字符转换工作。 (2)使用流成员函数 输出流成员函数为:put函数、write函数 输入流成员函数有:get函数、getline函数、read函数,例12-Simple:分析下列程序的输出结果。,#include #include void main() ofstream ostrm; ostrm.open(C
17、:f1.dat); ostrmMendl; ostrm310.85endl; ostrm.close();,M,310.85,ifstream istrm(C:f1.dat); char n; double d; istrmnd; coutn, dendl; istrm.close(); ,#include #include #include void main() fstream outfile; outfile.open(f2.dat,ios:out); if(!outfile) coutf2.dat cant open. endl; abort(); outfilethis is a p
18、rogram. endl; outfile.close(); ,要指定具体路径, 否则在当前目录!,例12:将文本写入指定的文件,例13从文本文件中读出信息,输 出,this is a program.,例14使用get()和put()函数读写文件,this is a c+ program.,输 出,例15将一文件内容拷贝到另一文件,文件的读写方法,实现“真正”的COPY功能,如: mycopy c:abc.txt d:123.txt mycopy c:abc.txt d:(不给定文件名) 即:给定两个参数!要用什么来实现?,例15-扩展思考并设计一个自己的拷贝命令,文件的读写方法,设计Myc
19、opy-简单实现,#include #include #include 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); cout1 file copied
20、.n; outfile.close(); infile.close(); ,设计Mycopy-完美实现,fstream outfile,infile;/输入输出流 char sour20,dest20;/放参数1,参数2 char sfile20,dfile20;/临时存放源文件与目标文件 strcpy(sour,argv1); int ns=strlen(argv1);/参数1的长度 strcpy(dest,argv2); int nd=strlen(argv2);/参数2的长度 /记住最后出现的位置,前是路径,后为文件名 int pos=0; for(int j=ns-1;j=0;j-)/
21、从后往前循环查找,找到就停止 if(sourj=)pos=j; break;,/从开始往后取出文件名并放入s_temp_file for(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(dfil
22、e,sfile); /再把路径与源文件名相连成目标文件,设计Mycopy-完美实现,infile.open(argv1,ios:in); 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();
23、,设计Mycopy-完美实现,二进制文件的读写操作,用write()往文件写入n个字节,ostream,写入什么?,写n个字节,转换成char *,用read()从文件读取n个字节,istream,从文件读取到buf中去,读n个字节,struct person char name20; double height; int age; ; person people6; /假设数组已经赋值 outfile.write( (char *),二进制文件的读写操作,例16对一个二进制文件进行读写操作,输 出,Wang1.6525 Zhang1.7224 Li1.6921 Huang1.722,二进制文
24、件的读写操作,随机访问数据文件,1、读文件指针(与get相对,所以有g),istream/获取当前指针位置,streampos为long型;seek_dir的值:,cur=1,相对于当前读指针指定的位置;,beg=0,相对于流的开始位置;,end=2,相对于流的结尾位置;,2、写文件指针(与put相对,所以有p),ostream,随机访问数据文件,举例随机文件读写操作,struct student char name20; long number; double totalscore; ; studentstu5=Ma,97001,85.72, Li,97002,92.62, Hu,97003,89.25, Yan,97004,90.84, Lu,97005,80.92;,fstream file1; student one; for(int i=0;i5;i+) ;/注意:最前面的记录是第0条! file1.write(char *),举例随机文件读写操作,例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024 - 2025房产市场购房指南【课件文档】
- 大学入党积极分子思想总结- 从“民为邦本”到“人民至上”的历史演进
- (2026年)杭州市临平区社区工作人员(网格员)考试题库真题及答案
- 梧州市藤县(2026年)辅警招聘公安基础知识考试题库及答案
- 2025 网络基础中网络协议的基本概念课件
- 2026年湖北事业单位招聘(公基)笔试题目及答案
- 2026年北京事业单位招聘考试题库及答案
- 2026年导游证基础题库与参考答案
- 互联网餐饮行业发展趋势及商业模式创新研究报告
- 健身教练的职业发展路径及面试技巧
- 香港公司购货合同(标准版)
- 2025年贵州省高考地理试卷真题(含答案)
- 煤矿企业一线从业人员主要工种考试题库-《探放水工》理论知识
- 2026届新高考数学热点精准复习浅谈“四新”背景下数列备考
- 急性阑尾炎课件教学
- 老年康复护理床上运动
- 木材加工厂消防安全规范
- 双硫仑反应的科普
- 消防设施维护保养方案(全系统模板)
- 小儿常见营养障碍性疾病
- 2026年内蒙古机电职业技术学院单招职业技能考试必刷测试卷附答案
评论
0/150
提交评论