C++程序设计课件第4章.ppt

上传人:za****8 文档编号:15798705 上传时间:2020-09-06 格式:PPT 页数:54 大小:185.52KB
返回 下载 相关 举报
C++程序设计课件第4章.ppt_第1页
第1页 / 共54页
C++程序设计课件第4章.ppt_第2页
第2页 / 共54页
C++程序设计课件第4章.ppt_第3页
第3页 / 共54页
点击查看更多>>
资源描述
2020/9/6,1,第4章 输入输出流,本章学习重点掌握内容: 输入输出流类体系结构 输入输出流的格式化 输入输出流对象 文本文件和二进制文件的输入和输出 综合应用实例,2020/9/6,2,第4章 输入输出流,4.1 输入输出流基本概念 4.2 输入输出流类体系 4.3 I/O流操作 4.4 文件流和文件的输入输出 4.5 字符串流 4.6 重载插入和提取运算符,2020/9/6,3,4.1 输入输出流基本概念,1、流 流是一种抽象,它负责在数据的生产者(程序/文件)和数据的消费者(文件/程序)之间建立联系,并管理数据的流动。 2、字节流 字节流分为字符流(也称文本流)和二进制流。字符流在数据传输时需作转换,效率较低。但可以直接编辑,显示或打印。,2020/9/6,4,4.1 输入输出流基本概念,二进制流将字节流的每个字节以二进制方式解释,它在数据传输时不作任何转换,故效率高。但无法人工阅读,可移植性较差。 3、 文件 文件是一般指存储在外部介质上数据的集合。计算机中的程序、数据、文档通常都组织成文件存放在外存储器中。,2020/9/6,5,4.1 输入输出流基本概念,4、缓冲 系统在主存中开辟的、用来临时存放输入输出数据的区域,成为输入输出缓冲区(简称缓冲区)。 5、命名空间 命名空间,就是在程序的不同的模块中使用相同的名字表示不同的事物(实体)。目的是提供一种机制,使大程序的各个部分中因出现重名而导致冲突的可能性降到最低。,2020/9/6,6,4.2输入输出流类体系,C+为实现数据的输入和输出定义了一个庞大的流类库,它包括的类主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream等。类istream和ostream是类ios的公有派生类,分别提供输入和输出操作。继承关系见下图 。,2020/9/6,7,4.2.1 流类库,2020/9/6,8,4.2.1 流类库,C+I/O常用流类列表(1),2020/9/6,9,4.2.1 流类库,C+I/O常用流类列表 (2),2020/9/6,10,4.2.2 标准流对象,C+ 语言在头文件 iostream.h 中预定义了 4个标准流类的对象: extern istream cin;/ 标准输入流对象 extern ostreamcout;/ 标准输出流对象 extern ostreamcerr;/ 标准错误流(非缓冲)对象 extern ostreamclog;/ 标准错误流对象,2020/9/6,11,4.2.2 标准流对象,cin 是console input缩写。在默认的情况下,代表键盘。 cout 是console output的缩写。在默认的情况下,代表显示器。 cerr和clog 是 console error和console log的缩写。在默认的情况下,代表显示器。这四个标准流中,cerr为非缓冲流,其余均为缓冲流。 输入就是从流中提取一个字节序列,C+用“”运算符表示提取,称为提取运算符。输出就是向流中插入一个字节序列,用“”运算符表示插入,称为插入运算符。这两个运算符分别定义在类ostream和istream中。,2020/9/6,12,4.2.2 标准流对象,【例4.1】使用流cout和cerr实现数据的输出。 #include void main(void) float a,b; cerrab; if (b!=0) couta/b=a/bn; else cerr”除数为零!n”; ,2020/9/6,13,4.3 I/O流操作,I/O流的格式化。iomanip.h中预定义的格式控制符,2020/9/6,14,4.3 I/O流操作,控制输出格式的流成员函数,2020/9/6,15,4.3 I/O流操作,设置格式状态的格式标志,2020/9/6,16,4.3 I/O流操作,【例4.2】用格式控制符setw、hex、dec指定输出数据的域宽和数制。 #include #include void main(void) int a=256,b=128; cout setw(8)a”b=”bn; /Line1 cout hexa”b=”decbn; /Line2 ,2020/9/6,17,4.3 I/O流操作,【例4.3】数据进制之间的转换。 #include /因iomanip.h中包含有iostream.h,所以该命令也可省略 #include void main() int x=30, y=300, z=1024; coutx y zendl; /按十进制输出 coutoctx y zendl; /按八进制输出 couthexx y zendl; /按十六进制输出,2020/9/6,18,4.3 I/O流操作,coutsetiosflags(ios:showbase | ios:uppercase); /设置基指示符和数值中的字母大写输出 coutx y zendl; /仍按十六进 制输出 coutresetiosflags(ios:showbase | ios:uppercase); /取消基指示符和数值中的字母大写输出 coutx y zendl; /仍按十六进制输出 coutdecx y zendl; /按十进制输出 ,其输出结果: 30 300 1024 36 454 2000 1e 12c 400 0X1E 0X12C 0X4 1e 12c 400 30 300 1024,2020/9/6,19,4.3 I/O流操作,【例4.4】使用setw控制符为同一行中输出的不同数据 项分别指定宽度。 #include #include using namespace std; void main() double values=1.23,35.36,653.7,4258.24; char*names=Zoot,Jimmy,Al,Stan; for(int i=0;i4;i+) outsetw(6)namesisetw(10)valuesiendl; ,其输出结果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,2020/9/6,20,4.3 I/O流操作,【例4.5】 使用cout的width成员函数控制输出宽度为10个字符宽,且按右对齐方式输出数值。 #include #include using namespace std; void main() double values=1.23,35.36,653.7,4258.24; char*names=Zoot,Jimmy,Al,Stan; for(int i=0;i4;i+) cout.width(10); cout.fill(*); coutvaluesiendl; ,其输出结果: *1.23 *35.36 *653.7 *4358.24,2020/9/6,21,4.3 I/O流操作,【例4.6】控制数据输出精度。 #include #include using namespace std; void main() double values=1.23,35.36,653.7,4358.24; char*names=Zoot,Jimmy,Al,Stan; for(int i=0;i4;i+) coutsetiosflags(ios_base:left)setw(6)namesiresetiosflags(ios_base:left)setw(10) setprecision(1) valuesiendl; ,输出结果: Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003,2020/9/6,22,4.3 I/O流操作,输入输出流检测错误的操作 【例4.7】输入不正确的数据 时,导致程序出错。 #include void main(void) int i,s; char t80; couti; s=cin.rdstate(); couts=sn;,enum io_state goodbit =0 x00, eofbit =0 x01, failbit =0 x02, badbit =0 x04, hardfail=0 x80 ;,int rdstate(); int eof(); int fail(); int bad(); int good(); int clear(int flag=0);,2020/9/6,23,4.3 I/O流操作,while(s) cin.clear(); cin.getline(t,80); couti; s=cin.rdstate(); coutnum=in; ,2020/9/6,24,4.3.2 用流成员函数实现输入输出,Put()函数。put函数把一个字符写到输入流中。 Get()函数。非格式化函数的功能与提取运算符“”很相像 。get函数在读入数据时包括空白字符 。 Getline()函数。getline成员函数的功能是允许从输入流中读取多个字符,并且允许指定输入终止字符(默认值是换行字符),在读取完成后,从读取的内容中删除该终止字符。,2020/9/6,25,4.3.2 用流成员函数实现输入输出,【例4.8】put函数应用举例,有一个字符串“ENGLISH”,要求按反序输出。 #include void main() char *p=ENGLISH; for (int i=6;i=0;i-) cout.put(*(p+i); cout.put(n); 运行结果:HSILGNE。,2020/9/6,26,4.3.2 用流成员函数实现输入输出,【例4.9】get函数应用举例,从键盘接收字符并输出。 #include void main() char ch; while(ch=cin.get()!=EOF) cout.put(ch); 运行时输入: Abc xyz 123 则输出结果: Abc xyz 123,2020/9/6,27,4.3.2 用流成员函数实现输入输出,【例4.10】getline函数应用举例,为输入流指定一个终止字符。 本程序连续读入一串字符,直到遇到字符“t”时停止,字符个数最多不超过80个。 #include void main() char line100; coutType a line terminated by t endl; cin.getline(line,81,t); coutline; coutn; ,输入:abcdefg hhht。 输出结果:abcdefg hhh。,2020/9/6,28,4.4 文件流和文件的输入输出,使用一个文件流,应遵循以下步骤: 打开一个文件。其目的是将一个文件流对象与某个磁盘文件联系起来。 使用文件流对象的成员函数,将数据写入到文件中或从文件中读取数据。 关闭已打开的文件,即将文件流对象与磁盘文件脱离联系。,2020/9/6,29,4.4 文件流和文件的输入输出,定义一个文件对象。例如: ifstream infile; / 定义输入文件流对象outfile ifstream infile(“filel.txt”); ofstream outfile; fstream iofile; 用文件流对象的成员函数open()或构造函数,打开一个文件。例如: outfile.open(“file2.txt”); 用提取、插入运算或成员函数对文件读写。例如:infilech; 用完文件后,使用文件流对象的成员函数关闭文件。例如:infile.close();,2020/9/6,30,4.4.1 用流成员函数实现输入输出,文件流类常用成员函数,2020/9/6,31,4.4.1 用流成员函数实现输入输出,文件打开方式说明,2020/9/6,32,4.4.4 文本文件的输入输出(读写),【例4.11】复制一个文本文件到一个目标文件当中。 #include void main(void) char ch,f1256,f2256; coutf1; coutf2; ifstream in(f1,ios:in | ios:nocreate);,2020/9/6,33,4.4.4 文本文件的输入输出(读写),ofstream out(f2); if(!in) coutch) outch; in.close(); out.close(); coutn复制完毕!n; ,2020/9/6,34,4.4.4 文本文件的输入输出(读写),【例4.12】设文本文件data1.txt中有若干实数,每个实数之间用空格或换行符隔开。求出文件中的这些实数的平均值和实数的个数。 #include void main(void) float sum=0,t; int count=0; ifstream in(data1.txt,ios:in|ios:nocreate); if(!in) cout不能打开输入文件:n;return;,2020/9/6,35,4.4.4 文本文件的输入输出(读写),while(int) /依次读一个实数 sum+=t,count+; coutn实数的平均值=sum/count,实数的个数=count; in.close(); ,可用记事本设置文件data1.txt的内容为: 20 50.9 30.7 46.6 89 90.8 24 50 50 程序运算结果:实数的平均值=50.222,实数的个数=9,2020/9/6,36,4.4.4 文本文件的输入输出(读写),【例4.13】在现有data2.txt文件后面追加信息。 #include #include using namespace std; /std是standard的缩写,标准C+中必须存在的一个名字 /空间的名字。包含标准C+类库所有的名字(类名、函数名等)。 int main() coutOpening output file.endl; ofstream ofile(data2.txt,ios:app);,2020/9/6,37,4.4.4 文本文件的输入输出(读写),if(!ofile.fail() coutAppending to file.endl; ofile这是一个没有注释的例子!; else coutopen fail.endl; return 0; ,可用记事本建立文本文件data2.txt,并向文件写入:“C+程序设计。”。,2020/9/6,38,4.4.5 二进制文件的输入输出(读写),二进制文件的读操作用成员函数read(): istream,2020/9/6,39,4.4.5 二进制文件的输入输出(读写),二进制文件的写操作用成员函数write(): ostream,2020/9/6,40,4.4.5 二进制文件的输入输出(读写),【例4.14】将1100之间的所有偶数存入二进制文件data2.dat中。 #include void main(void) ofstream out(data2.dat,ios:out|ios:binary); /Line1 if(!out)coutdata2.datn;return; for(int i=2;i100;i+=2) out.write(char*) ,2020/9/6,41,4.4.5 二进制文件的输入输出(读写),【例4.15】 写一个整型数组和一个浮点型数组到二进制文件data3.dat中,然后从data3.dat中读取数据,并显示。 #include #include void main() int i_number5=10,20,30,40,50; float f_number5=1.53,2.2,3.0,4.0,5.55; int int_arr5; float float_arr5; ofstream out(data3.dat);/打开一个文件 if(!out) coutcan not open data3n; return; ,2020/9/6,42,4.4.5 二进制文件的输入输出(读写),out.write(unsigned char*),2020/9/6,43,4.4.5 二进制文件的输入输出(读写),for(int i=0;i5;i+)/显示浮点数 coutfloat_arri ; coutendl; for(i=0;i5;i+)/显示整数 coutint_arri ; coutendl; cout程序执行完毕!n; return; ,运行结果: 1.53 2.2 3 4 5.55 10 20 30 40 50,2020/9/6,44,4.4.6 文件的随机访问,C+把文件看作有序的n个字节的流,2020/9/6,45,4.4.6 文件的随机访问,对于输入流来说,用于文件读写位置定的成员函数有: istream /返回当前文件读写位置,2020/9/6,46,4.4.6 文件的随机访问,【例4.16】将5200之间的奇数存入二进制文件,然后再将文件中的第3039位置之间的数依次读出并输出。 #include void main(void) int i,x; ofstream out(data3.dat,ios:out|ios:binary); if(!out)cout不能打开文件d.datn;return; for(i=5;i200;i+=2) out.write(char*),2020/9/6,47,4.4.6 文件的随机访问,ifstream f(data3.dat,ios:in|ios:binary); if(!f) cout不能打开文件d.datn; return; f.seekg(30*sizeof(int); /文件指针移到指定位置 for(i=0;i10 ,2020/9/6,48,4.5 字符串流,建立输出字符串流对象。ostrstream类提供的构造函数的原型为: ostrstream:ostrstream(char*buffer,int n,int mode=ios:out); 建立输入字符串流对象 istrstream类提供了两个带参的构造函数,istrstream类提供的构造函数的原型为:istrstream:istrstream(char*buffer); istrstream:istrstream(char*buffer,int n); 建立输入输出字符串流对象。strstream类提供的构造函数的原型为: strstream:strstream(char*buffer,int n,int mode);,2020/9/6,49,4.5 字符串流,【例4.17】提取一个字符串中的每一个整数,并把它们依次存入到一个字符串流中,最后向屏幕输出这个字符串流。字符串从键盘输入。字符串流结束符使用的特殊字符“$”。 #include void main() char a50; char b50; istrstream sin(a); /定义一个输入字符串流sin,使用的字符数组为a ostrstream sout(b,sizeof(b);/定义一个输出字符串流sout,使用b数组,2020/9/6,50,4.5 字符串流,cin.getline(a,sizeof(a); char ch= ; int x; while(ch!=$) if(ch=48 ,Ab108+506,446*55525/ad763,WfR40jjf:kk63;99$,2020/9/6,51,4.5 字符串流,sinx; /从流中读入一个整数,当碰到非数字字 /符时则就认为一个整数结束。 soutx ; /将x输出到字符串流sout中 sin.get(ch); /从sin流中读入下一个字符 sout$ends; /向sout流输出作为结束符的$字符和 /一个字符串结束符0 coutb; /输出字符串流sout对应的字符串 coutendl; ,该程序的运行结果: Ab108+506,446*55525/ad763,WfR40jjf:kk63;99$ 108 506 446 555 25 763 40 63 99 $,2020/9/6,52,4.6 重载插入和提取运算符,为了输入和输出类类型的数据,用户可以重载“”运算符。 【例4.19】重载提取和插入运算符,直接输入输出对象。 #include class CMoney public: friend ostream ostream coutm; coutm; cout程序执行完毕!n; ,执行程序时,若输入数据为:200 50 则程序输出结果:¥200元 50分,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!