计算机程序设计基础_精讲多练CC++_第8章_第1页
计算机程序设计基础_精讲多练CC++_第8章_第2页
计算机程序设计基础_精讲多练CC++_第8章_第3页
计算机程序设计基础_精讲多练CC++_第8章_第4页
计算机程序设计基础_精讲多练CC++_第8章_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、第第8 8章章 文件与数据输入输出文件与数据输入输出3教学目标l(1) 了解文件和流的概念;了解文件和流的概念;l(2) 了解输入输出流类或标准了解输入输出流类或标准I/O函数库的结构和函数库的结构和机制;机制;l(3) 了解文件的打开与关闭操作及文件读写的基了解文件的打开与关闭操作及文件读写的基本方法。本方法。4基本内容 l8.1 输入输出与标准库输入输出与标准库l8.2 标准输入流标准输入流l8.3 标准输出流标准输出流l8.4 文件文件58.1 输入输出与标准库l标准库构成标准库构成l标准函数库标准函数库l从从C语言中继承下来语言中继承下来lC格式的输入输出函数、字符与字符串处理函数、数

2、学函数、格式的输入输出函数、字符与字符串处理函数、数学函数、时间日期函数、动态分配函数以及一些实用函数时间日期函数、动态分配函数以及一些实用函数 l标准类库标准类库l标准标准C+的的I/O流类、字符串类、数字类、异常处理和杂项类流类、字符串类、数字类、异常处理和杂项类以及以及STL容器类容器类 l由编译器厂商提供,与平台、厂商和编译器版本由编译器厂商提供,与平台、厂商和编译器版本无关无关6输入输出流类库iostreamliostream类库提供了数百种类库提供了数百种I/O功能,其接口功能,其接口部分分别包含在几个头文件中部分分别包含在几个头文件中:l无格式无格式I/O和格式化和格式化I/O:

3、头文件:头文件iostreaml格式化格式化I/O :包含头文件包含头文件iomanipl文件处理操作文件处理操作 :包含头文件:包含头文件fstream7输入/输出流类的继承层次结构iosistreamostreamiostreamifstreamofstreamfstream88.2 标准输入流lcin是类是类istream内置的标准流类对象,能构成从内置的标准流类对象,能构成从键盘到内存的标准输入流。通过流提取运算符键盘到内存的标准输入流。通过流提取运算符“”,变量从流中提取数据。,变量从流中提取数据。l“”会自动忽略所有的空白字符,因此无法输会自动忽略所有的空白字符,因此无法输入包含空

4、格符的字符串。如:入包含空格符的字符串。如:char name20;cinname;l假如输入姓名假如输入姓名“Tom Hanks”时,变量时,变量name中只有中只有“Tom”9输入流对象的成员函数get()l这个函数有这个函数有3种重载形式:种重载形式:lcin.get()l用于从指定的输入流中读取一个字符,函数的返回值即为用于从指定的输入流中读取一个字符,函数的返回值即为读入的字符。读入的字符。lcin. get(ch)l用于从指定的输入流中读取一个字符,并将该字符赋给字用于从指定的输入流中读取一个字符,并将该字符赋给字符型变量符型变量ch。lcin.get(字符数组字符数组buf, 字

5、符个数字符个数n, 结束符结束符delim)l用于从指定的输入流中读取用于从指定的输入流中读取n-1个字符,并将这些字符赋给个字符,并将这些字符赋给字符数组字符数组buf。如果还没有读取完。如果还没有读取完n-1个字符之前就遇到结束个字符之前就遇到结束符符delim,则可提前结束读取过程。结束符,则可提前结束读取过程。结束符delim的默认值为的默认值为换行符换行符n 。10例8-2:包含空格的字符串的输入与输出#include using namespace std;int main()char ch1, ch2, ch3, buf150, buf250;cout buf1;cout 使用运

6、算符使用运算符读取句子:读取句子: buf1 endl;ch1 = cin.get();ch2 = cin.get();cout 使用使用cin.get()继续读取:继续读取: ch1 endl;cout 使用使用cin.get()继续读取:继续读取: ch2 endl;cin.get(ch3);cout 使用使用cin.get(ch3)继续读取:继续读取: ch3 endl;cin.get(buf2, 50);cout 使用使用cin.get(buf2, 50)继续读取:继续读取: buf2 endl;return 0; 11输入流对象的成员函数输入流对象的成员函数 lgetlExtract

7、s characters from the stream up to, but not including, delimiters.lgetlinelExtracts characters from the stream (extracts and discards delimiters).lreadlExtracts data from the stream.lignorelExtracts and discards characters.lpeeklReturns a character without extracting it from the stream.lgcountlCount

8、s the characters extracted in the last unformatted operation.128.3 标准输出流l输出流类输出流类ostream的标准输出流对象的标准输出流对象cout通过流通过流插入运算符插入运算符“”,把变量的值从内存输出到标,把变量的值从内存输出到标准输出设备上。准输出设备上。l系统会自动根据不同的数据类型采用不同的默系统会自动根据不同的数据类型采用不同的默认方式输出。认方式输出。l特殊要求的输出格式,需要格式化特殊要求的输出格式,需要格式化I/Ol使用流操纵符对输出操作进行格式化使用流操纵符对输出操作进行格式化l使用使用ios类的格式控制

9、成员函数进行格式化类的格式控制成员函数进行格式化131. 使用流操纵符对输出操作进行格式化使用流操纵符对输出操作进行格式化l不带参数的流操纵符不带参数的流操纵符lendlldec/oct/hex 十十/八八/十六进制十六进制l带参数的流操纵符带参数的流操纵符 (注意:需包含头文件注意:需包含头文件iomanip)lsetbase(int base)设置数制转换基数为设置数制转换基数为baselsetfill(int ch)将填充字符设置为将填充字符设置为chlsetprecision(int p)设置数字精度设置数字精度lsetw(int w)将域宽设置为将域宽设置为wlsetiosflags

10、(fmtflags flags)开启开启flags中指定的标志中指定的标志lresetiosflags(fmtflags flags)关闭关闭flags中指定的标志中指定的标志其中,流格式状态标志字其中,流格式状态标志字(flags):lios:left在域中左对齐输出,右边显示填充字符在域中左对齐输出,右边显示填充字符lios:dec指定整数应作为十进制指定整数应作为十进制(基数基数10)值值lios:hex指定整数应作为十六进制指定整数应作为十六进制(基数基数16)值值lios:showpos 指定正数和负数前面分别加上指定正数和负数前面分别加上+和和-号号lios:fixed指定浮点数以

11、小数方式输出指定浮点数以小数方式输出lios:scientific 指定浮点数输出采用科学记数法指定浮点数输出采用科学记数法14例例8-4:改变整数的进制:改变整数的进制#include using namespace std;int main()int n = 30;cout 整数:整数: n endl;cout 以十六进制显示为:以十六进制显示为: hex n endl;cout 以十进制显示为:以十进制显示为: dec n endl;cout 以八进制显示为:以八进制显示为: oct n endl;return 0; 15例8-3:设置实型数的精度#include #include #i

12、nclude using namespace std;int main()double r = sqrt( 2.0 );int i;cout r = r endl;/ 设置输出为定点小数方式设置输出为定点小数方式cout setiosflags( ios:fixed) ;cout 以定点小数方式,采用不同精度输出:以定点小数方式,采用不同精度输出: endl;for ( i = 0; i = 4; i+ )cout setprecision( i ) r = r endl;/ 取消定点小数输出方式并设置为科学记数方式取消定点小数输出方式并设置为科学记数方式cout resetiosflags(

13、 ios:fixed) setiosflags( ios:scientific) ;cout 以科学记数方式,采用不同精度输出:以科学记数方式,采用不同精度输出: endl;for ( i = 0; i = 4; i+ )cout setprecision( i ) r = r endl;return 0;16例8-5:设置输出宽度、填充字符和对齐方式#include #include using namespace std;int main()double pi=3.14159;/ 以默认方式输出以默认方式输出cout pi endl;/ 设置输出宽度后进行输出设置输出宽度后进行输出cout

14、 setw(10) pi endl;/ 使用填充字符并设置输出宽度后进行输出使用填充字符并设置输出宽度后进行输出cout setfill(*) setw(10) pi endl;/ 设置左对齐方式及输出宽度后进行输出设置左对齐方式及输出宽度后进行输出cout setiosflags(ios:left) setw(10) pi endl;/ 取消左对齐方式取消左对齐方式cout resetiosflags(ios:left);/ 设置右对齐方式及输出宽度后进行输出设置右对齐方式及输出宽度后进行输出cout setiosflags(ios:right) setw(12) pi endl; retu

15、rn 0; 172. 使用使用ios类的格式控制成员函数对输出操作进行格式化类的格式控制成员函数对输出操作进行格式化l格式化函数格式化函数lwidth(w)设置显示字段宽度为设置显示字段宽度为wlprecision(p) 设置浮点数精度为设置浮点数精度为plfill(ch)设置填充字符为设置填充字符为chlsetf(flags)设置输出格式状态为设置输出格式状态为flagslunsetf(flags) 清除格式标记清除格式标记flagsl其中,流格式状态标志字其中,流格式状态标志字(flags)同前。同前。#include using namespace std;int main()cout.

16、precision(4);cout.width(10);cout 10.12345 endl;cout.fill(*);cout.width(10);cout 10.12345 endl;cout.width(10);cout Hi! endl; cout.width(10);cout.setf(ios:left);cout 10.12345endl;cout.setf(ios:uppercase | ios:scientific);cout 10.12345endl;cout.unsetf(ios:uppercase);cout 10.12345endl;return 0;运行结果:运行结果

17、: 10.12*10.12*Hi!10.12*1.0123E+0011.0123e+00119规规 则则l成员函数成员函数width(w)和流操纵符和流操纵符setw(w)都只对其后的第都只对其后的第一个输出项有效一个输出项有效l用成员函数用成员函数setf或流操纵符或流操纵符setiosflags设置输出格式后,设置输出格式后,如果要改为同组另一状态,应调用如果要改为同组另一状态,应调用unsetf或或resetiosflags先终止先终止lios:leftlios:right20输出流对象的成员函数输出流对象的成员函数 lputlInserts a single byte into the

18、 stream.lwritelInserts a series of bytes into the stream.lflushlFlushes the buffer associated with this stream. lseekplChanges the streams put pointer.ltellplGets the value of the streams put pointer.218.4 文件l8.4.1 文件和流文件和流l8.4.2 文件的打开和关闭文件的打开和关闭l8.4.3 文件的读写文件的读写22iosistreamostreamiostreamifstreamof

19、streamfstream#include lC+把每一个文件都看成一个有序的字节流,对文件的操作可采用把每一个文件都看成一个有序的字节流,对文件的操作可采用与输入输出流相关的方法。与输入输出流相关的方法。l头文件头文件fstream包含了流类包含了流类ifstream(从文件输入从文件输入)、ofstream(向文件输向文件输出出)和和fstream(从文件输入输出从文件输入输出)的定义。的定义。文件文件I/O流类的继承层次结构流类的继承层次结构23l文件的处理由三个步骤组成:打开文件,数据读写,关闭文件。文件的处理由三个步骤组成:打开文件,数据读写,关闭文件。l1. 打开文件,两种方法:打

20、开文件,两种方法:l1)先建立文件流对象,再调用成员函数)先建立文件流对象,再调用成员函数open()将它与某一个文件关联将它与某一个文件关联ifstream infile; / 输入文件流对象输入文件流对象ofstream outfile; / 输出文件流对象输出文件流对象fstream iofile; / 输入输出文件流对象输入输出文件流对象outfile.open(a.dat);l2)在建立文件流对象的同时通过构造函数来打开文件。如:)在建立文件流对象的同时通过构造函数来打开文件。如: ofstream outfile (a.dat);l测试文件是否被正确打开的方法如下:测试文件是否被正

21、确打开的方法如下:if ( ! outfile)/ 处理文件打开失败情况的代码处理文件打开失败情况的代码l2. 关闭文件:成员函数关闭文件:成员函数close() outfile.close( );8.4.2 文件的打开和关闭24l使用插入与提取运算符对文件进行读写使用插入与提取运算符对文件进行读写l读文件 l写文件 l使用类成员函数对文件流进行操作使用类成员函数对文件流进行操作lget读/put写一次读写一个字节listream& get ( char& rch);lostream& put ( char ch);lgetline一次读一行 listream&

22、 getline(char* pch, int nCount, char delim = n );8.4.3 文件的读写/ 例例8-6:写文件:写文件#include #include using namespace std;int main()ofstream outfile(grade.txt);if(!outfile)cout 文件打开失败!文件打开失败!endl;return 1;outfile 程序设计程序设计 95 endl;outfile 大学英语大学英语 90.5 endl;outfile 高等数学高等数学 93 endl;outfile 普通物理普通物理 87.5 endl;

23、outfile.close();return 0; / 例例8-7:读文件:读文件#include #include using namespace std;int main()ifstream infile(grade.txt);if(!infile)cout 文件打开失败!文件打开失败! course score;cout course score course score;cout course score course score;cout course score course score;cout course score endl;infile.close();return 0;

24、 注意:注意:VC+ 6.0编译器编译器不能正确判断不能正确判断if(! infile)/ 例例8-8:使用成员函数:使用成员函数get()完成文件读操作完成文件读操作#include #include using namespace std;int main()char ch;int count=0;/ 计数器计数器ifstream infile(grade.txt);if(!infile)cout 文件打开失败文件打开失败endl;return 1;while(!infile.eof( ) infile.get(ch);/ 从文件流中读入下一个字符从文件流中读入下一个字符cout=0 &a

25、mp; ch=9) count+; / 若是数字字符,计数器加若是数字字符,计数器加1coutendl文件中共有数字字符文件中共有数字字符:count个。个。endl;infile.close();return 0; 28扩展阅读l8.5 二进制文件二进制文件l二进制文件以位(二进制文件以位(bit)为单位,整个文件是由)为单位,整个文件是由0和和1组成的无格式的原始数据序列。在二进制方式下的组成的无格式的原始数据序列。在二进制方式下的输入输出过程中,系统不对数据进行任何转换。输入输出过程中,系统不对数据进行任何转换。l文本文件以字节(文本文件以字节(byte)为单位,整个文件实际保)为单位,

26、整个文件实际保存的是一串存的是一串ASCII字符。可用文字处理器进行编辑。字符。可用文字处理器进行编辑。在文本方式下的输入输出过程中,系统进行字符转在文本方式下的输入输出过程中,系统进行字符转换。换。29文件打开方式文件打开方式 openmode说说明明ios:app将所有输出写入文件末尾将所有输出写入文件末尾ios:ate打开文件以便输出,并移到文件末尾打开文件以便输出,并移到文件末尾(通常用于添通常用于添加数据加数据) 数据可以写入文件中的任何地方数据可以写入文件中的任何地方ios:in打开文件以便输入打开文件以便输入ios:out打开文件以便输出打开文件以便输出ios:trunc删除文件

27、现有内容删除文件现有内容(是是ios:out的默认操作的默认操作)ios:binary用二进制而不是文本模式打开文件用二进制而不是文本模式打开文件ios:nocreate如果文件不存在,则文件打开失败如果文件不存在,则文件打开失败ios:noreplace如果文件存在,则文件打开失败如果文件存在,则文件打开失败/ 例例8-9:文件拷贝的程序:文件拷贝的程序#include #include using namespace std;int main()char s50, d50;couts;coutd;ifstream infile(s, ios:binary);ofstream outfile

28、(d, ios:binary);if(!infile | !outfile)cout 文件打开失败!文件打开失败!endl;return 1;char ch;while(!infile.eof() )infile.get (ch);/ 成员函数成员函数get( )用于从输入流中读取一个字符到变量用于从输入流中读取一个字符到变量choutfile.put(ch);/ 成员函数成员函数put( )将字符变量将字符变量ch中的字符写到输出流中中的字符写到输出流中infile.close();outfile.close();return 0; 31上机指导l8.5 Visual C+的帮助功能的帮助功能 32应用举例l例例8-10 打开一个由若干个整数组成的文本文打开一个由若干个整数组成的文本文件件“number.txt”,找出其中所有的质数并存,找出其中所有的质数并

温馨提示

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

评论

0/150

提交评论