C++程序设计--对象分册(第4章).ppt_第1页
C++程序设计--对象分册(第4章).ppt_第2页
C++程序设计--对象分册(第4章).ppt_第3页
C++程序设计--对象分册(第4章).ppt_第4页
C++程序设计--对象分册(第4章).ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第4章 输入输出流,本章学习重点掌握内容: 输入输出流类体系结构 输入输出流的格式化 输入输出流对象 文本文件和二进制文件的输入和输出 综合应用实例,2,第4章 输入输出流,4.1 输入输出流基本概念 4.2 输入输出流类体系 4.3 I/O流操作 4.4 文件流和文件的输入输出 4.5 字符串流 4.6 重载插入和提取运算符,类型安全和可扩展性相对c,C语言 printf(“%d”,f);/f为浮点变量,输出变量 printf(“%d”,”C+”);/输出字符串起始地址 scanf(“%d”,i);/漏写/ 标准输入流对象 extern ostreamcout;/ 标准输出流对象 ext

2、ern ostreamcerr;/ 标准错误流(非缓冲)对象 extern ostreamclog;/ 标准错误流对象 cin、cout不是c+提供的语句,而是对象,”和”,istream将运算符”重载为标准类型的提取运算符,如 istream operator (int); ostream将运算符” ”用于自己定义的数据类型,则需重载,10,11,4.2.2 标准流对象,cin 是console input缩写。代表键盘。 cout 是console output的缩写。代表显示器。 cerr和clog 是 console error和console log的缩写。在默认的情况下,代表显示器

3、, cerr为非缓冲流,其余均为缓冲流。 输入就是从流中提取一个字节序列,C+用“”运算符表示提取,称为提取运算符。输出就是向流中插入一个字节序列,用“”运算符表示插入,称为插入运算符。这两个运算符分别定义在类ostream和istream中。,cin对象,cin 是istream类的对象,从标准的输入设备获取数据,程序变量通过流提取符”,提取数据 ”从流中提取数据跳过空格,tab键、换行字符,只有在输完数据再回车后,该行数据送入缓冲区,形成输入流, ”才从中提取数据。 需保证正常数据提取数据,如果提取数据失败,cin流置为出错状态,不在提取数据,只有回到正常状态,才可以提取数据 cin 为0

4、即false 出错状态,否则为正常状态,12,cout流对象,cout不是C+预定义的关键字,是ostream流类对象 输出基本类型是,不必考虑是什么类型,系统会判断数据类型,根据类型调用重载的函数 cout流在内存中开辟一个缓冲区,用来存放流数据,当向cout插入一个endl,不论缓冲区是否已满,都输出流中数据,插入换行符,清空缓冲区 cout只对标准数据输入输出,自定义的数据需要重载,13,cerr,cerr标准出错流,指定预显示器关联,向标准出错设备输出出错信息 cerr与cout作用用法差不多,不同在于cout通常传送到显示器,也可以重定向到文件,cerr只能在显示器输出。调试程序不希

5、望出错信息送到其他文件只能自显示器输出时,选用 clog也是标准的出错流,与cerr唯一的区别在于,cerr不经过缓冲区,直接输出,clog则经过缓冲区,14,15,4.2.2 标准流对象,【例4.1】使用流cout和cerr实现数据的输出。 #include using namespace std; void main(void) float a,b; cerrab; if (b!=0) couta/b=a/bn; else cerr”除数为零!n”; ,16,4.3 I/O流操作,I/O流的格式化。iomanip.h中预定义的格式控制符,17,4.3 I/O流操作,控制输出格式的流成员函数

6、,18,4.3 I/O流操作,设置格式状态的格式标志,19,4.3 I/O流操作,【例4.2】用格式控制符setw、hex、dec指定输出数据域宽和数制。 #include #include using namespace std; void main(void) int a=256,b=128; cout setw(8)a”b=”bn; /Line1 cout hexa”b=”decbn; /Line2 ,20,4.3 I/O流操作,【例4.3】数据进制之间的转换。 #include #include using namespace std; void main() int x=30, y=

7、300, z=1024; coutx y zendl; coutoctx y zendl; couthexx y zendl; 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,21,4.3 I/O流

8、操作,【例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+) coutsetw(6)namesisetw(10)valuesiendl; ,其输出结果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,22,4.3 I/O流操作,【例4.5】 使用cout的w

9、idth成员函数控制输出宽度为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,23,4.3 I/O流操作,【例4.6】控制数据输出精度。 #include #

10、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,24,4.3 I/O流

11、操作,输入输出流检测错误的操作 【例4.7】输入不正确的数据 时,导致程序出错。 #include using namespace std; 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();

12、int clear(int flag=0); /对应的错误函数,25,4.3 I/O流操作,while(s) cin.clear(); cin.getline(t,80); couti; s=cin.rdstate(); coutnum=in; ,26,4.3.2 用流成员函数实现输入输出,put()函数。put函数把一个字符写到输出流中。 get()函数。非格式化函数的功能与提取运算符“”很相像 。get函数在读入数据时包括空白字符 。 getline()函数。getline成员函数的功能是允许从输入流中读取多个字符,并且允许指定输入终止字符(默认值是换行字符),在读取完成后,从读取的内容中

13、删除该终止字符。,27,4.3.2 用流成员函数实现输入输出,【例4.8】put函数应用举例,有一个字符串“ENGLISH”,要求按反序输出。 #include #include using namespace std; void main() char *p=ENGLISH; for (int i=6;i=0;i-) cout.put(*(p+i); cout.put(n); ,28,4.3.2 用流成员函数实现输入输出,【例4.9】get函数应用举例,从键盘接收字符并输出。 #include using namespace std; void main() char ch; while(c

14、h=cin.get()!=EOF) cout.put(ch); ,29,4.3.2 用流成员函数实现输入输出,【例4.10】getline函数应用举例,为输入流指定一个终止字符。 本程序连续读入一串字符,直到遇到字符“t”时停止,字符个数最多不超过80个。 #include using namespace std; void main() char line100; coutType a line terminated by t endl; cin.getline(line,81,t); coutline; coutn; ,输入:abcdefg hhht。 输出结果:abcdefg hhh。,

15、30,4.4 文件流和文件的输入输出,使用一个文件流,应遵循以下步骤: 打开一个文件。其目的是将一个文件流对象与某个磁盘文件联系起来。 使用文件流对象的成员函数,将数据写入到文件中或从文件中读取数据。 关闭已打开的文件,即将文件流对象与磁盘文件脱离联系。,31,4.4 文件流和文件的输入输出,定义一个文件对象。例如: ifstream infile; ifstream infile(“filel.txt”); ofstream outfile; fstream iofile; 用文件流对象的成员函数open()或构造函数,打开一个文件。 outfile.open(“file2.txt”); 用

16、提取、插入运算或成员函数对文件读写。 infilech; 用完文件后,使用文件流对象的成员函数关闭文件。 infile.close();,32,4.4.1 用流成员函数实现输入输出,文件流类常用成员函数,33,4.4.1 用流成员函数实现输入输出,文件打开方式说明,34,4.4.4 文本文件的输入输出(读写),【例4.11】复制一个文本文件到一个目标文件当中。 #include #include using namespace std; void main(void) char ch,f1256,f2256; coutf1; coutf2; ifstream in(f1,ios:in | io

17、s:nocreate); ofstream out(f2); if(!in) coutch) outch; in.close(); out.close(); coutn复制完毕!n; ,35,4.4.4 文本文件的输入输出(读写),【例4.12】设文本文件data1.txt中有若干实数,每个实数之间用空格或换行符隔开。求出文件中的这些实数的平均值和实数的个数。 #include #include using namespace std; void main(void) float sum=0,t; int count=0; ifstream in(data1.txt,ios:in|ios:no

18、create); if(!in) coutt) 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,36,4.4.4 文本文件的输入输出(读写),【例4.13】在现有data2.txt文件后面追加信息。 #include #include using namespace std; int main() coutOpening output file

19、.endl; ofstream ofile(data2.txt,ios:app); if(!ofile.fail() coutAppending to file.endl; ofile这是一个没有注释的例子!; else coutopen fail.endl; return 0; ,可用记事本建立文本文件data2.txt,并向文件写入:“C+程序设计。”。,37,4.4.5 二进制文件的输入输出(读写),二进制文件的读操作用成员函数read(): istream,二进制文件的写操作用成员函数write(): ostream,38,4.4.5 二进制文件的输入输出(读写),【例4.14】将11

20、00之间的所有偶数存入二进制文件data2.dat中。 #include #include using namespace std; void main(void) ofstream out(data2.dat,ios:out|ios:binary); if(!out)coutdata2.datn;return; for(int i=2;i100;i+=2) out.write(char*) ,39,4.4.5 二进制文件的输入输出(读写),【例4.15】 写一个整型数组和一个浮点型数组到二进制文件data3.dat中,然后从data3.dat中读取数据,并显示。 #include #incl

21、ude using namespace std; 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; out.write(unsigned char*)f_number,sizeof(f_number); out.write(unsigned char*)i_number,sizeof(i_n

22、umber);,40,4.4.5 二进制文件的输入输出(读写),out.close(); ifstream in(data3.dat); if(!in) coutcan not open data3n;return; in.read(unsigned char*)float_arr,sizeof(float_arr); in.read(unsigned char*)int_arr,sizeof(int_arr); in.close(); for(int i=0;i5;i+) coutfloat_arri ; coutendl; for(i=0;i5;i+) coutint_arri ; cou

23、tendl; cout程序执行完毕!n; return; ,运行结果: 1.53 2.2 3 4 5.55 10 20 30 40 50,41,4.4.6 文件的随机访问,C+把文件看作有序的n个字节的流,42,4.4.6 文件的随机访问,对于输入流来说,用于文件读写位置定的成员函数有: istream,43,4.4.6 文件的随机访问,【例4.16】将5200之间的奇数存入二进制文件,然后再将文件中的第3039位置之间的数依次读出并输出。 #include #include using namespace std; 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论