《第 9 章(2)━━输入输出流.ppt》由会员分享,可在线阅读,更多相关《第 9 章(2)━━输入输出流.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+程序设计程序设计第第9章章(2)文件文件输入输出流输入输出流1主要内容主要内容l数据文件数据文件l文件文件 I/O 流类体系流类体系l文件的使用文件的使用定义文件流、打开文件、读定义文件流、打开文件、读/写操作、关闭文件写操作、关闭文件l文件的随机访问文件的随机访问l文本文件的使用文本文件的使用l二进制文件的使用二进制文件的使用l数据文件与对象数据文件与对象l串串 I/O 流类体系(选读)流类体系(选读)l串流的定义和使用串流的定义和使用(选读)(选读)2数据文件数据文件l程序文件:程序文件:源程序文件(源程序文件(.cpp)、目标文件()、目标文件(.obj)、可执行文件()、可执行文件
2、(.exe)等。)等。l数据文件数据文件:指存储在磁盘上,由文件名标识的一组数据信息的集合。根据磁盘文件指存储在磁盘上,由文件名标识的一组数据信息的集合。根据磁盘文件中数据的组织形式,可分为:文本文件、二进制文件。中数据的组织形式,可分为:文本文件、二进制文件。l文本文件(文本文件(ASCII文件、字符文件):文件、字符文件):在文本文件中,数据是按在文本文件中,数据是按ASCII码格式存储,一个数据对应一个字符序列,一个字符码格式存储,一个数据对应一个字符序列,一个字符对应一个字节,字节中存放的是该字符的对应一个字节,字节中存放的是该字符的ASCII码。文本文件中的数据可以直观显示,码。文本
3、文件中的数据可以直观显示,便于阅读。但是,程序对其进行读取便于阅读。但是,程序对其进行读取/写入时,一般需做数据格式上的转换!写入时,一般需做数据格式上的转换!程序输出时,将内存中要输出的数据,程序输出时,将内存中要输出的数据,从从内存中内部存储格式的内存中内部存储格式的数据(二进制)数据(二进制)转换转换成成字符序列格式的数据字符序列格式的数据后,再后,再写入文本文件中。写入文本文件中。字符序列中的每个字符在字符序列中的每个字符在文本文本文件文件中占用中占用一个字节,存放的是该字符的一个字节,存放的是该字符的ASCII码。码。程序输入时,从文本文件中读取一个字符序列格式的数据,程序输入时,从
4、文本文件中读取一个字符序列格式的数据,将将字符序列格式的数据字符序列格式的数据转转换成换成内存中内部存储格式的内存中内部存储格式的数据(二进制)数据(二进制)后,再赋给后,再赋给内存中内存中对应的变量,对应的变量,而该数而该数据在内存中的内部存储格式是由对应变量的类型决定的。据在内存中的内部存储格式是由对应变量的类型决定的。3数据文件数据文件l二进制文件(内部格式文件、字节文件):二进制文件(内部格式文件、字节文件):在二进制文件中,数据是按其在内存中的内部格式存储,一个数据对应若干个字节,在二进制文件中,数据是按其在内存中的内部格式存储,一个数据对应若干个字节,字节中存放的二进制码与内存中的
5、相同。二进制文件中的数据不能直观显示,无法字节中存放的二进制码与内存中的相同。二进制文件中的数据不能直观显示,无法阅读。但是,程序对其进行读取阅读。但是,程序对其进行读取/写入时,无需做任何数据格式上的转换!写入时,无需做任何数据格式上的转换!程序输出时,将内存中要输出的数据,程序输出时,将内存中要输出的数据,按其在按其在内存中内部存储格式内存中内部存储格式(二进制),(二进制),不做不做任何转换任何转换,原样写入二进制文件中。,原样写入二进制文件中。程序输入时,从二进制文件中读取若干个字节,程序输入时,从二进制文件中读取若干个字节,不做任何转换不做任何转换,直接,直接赋给赋给程序中程序中对应
6、对应的变量,的变量,而而读取的字节数是读取的字节数是由对应变量的类型决定的。由对应变量的类型决定的。【例例】int a=100000;则在内存中占则在内存中占 4 个字节,以整数形式存放。个字节,以整数形式存放。00000000 00000001 10000110 10100000100000在在内存内存中的内部存储格式为:中的内部存储格式为:00110001 00110000 00110000 00110000 00110000 00110000100000在在文本文件文本文件中的存储格式为:中的存储格式为:00000000 00000001 10000110 10100000100000在
7、在二进制文件二进制文件中的存储格式为:中的存储格式为:4文件文件 I/O 流类体系流类体系lC+中进行文件输入中进行文件输入/输出操作,需要文件流类体系的支持。文件输入输出操作,需要文件流类体系的支持。文件输入/输出流类库包输出流类库包含在含在 fstream.h/fstream 头文件中头文件中,全部为公有派生。全部为公有派生。iosstreambuffilebuf指针指针ostreamofstream 文件输出流类文件输出流类ostream_withassignistreamifstream 文件输入流类文件输入流类istream_withassigniostreamfstream 文件输
8、入输出流类文件输入输出流类5文件文件 I/O 流类体系流类体系lfilebuf 类:类:是是 streambuf 类的派生类,用于管理文件缓冲区。类的派生类,用于管理文件缓冲区。lifstream 文件输入流类文件输入流类:支持从磁盘文件中读取数据的各种操作。支持从磁盘文件中读取数据的各种操作。要从某磁盘文件中读取数据,首先要定义文件输入流对象,并将文件输入流与该磁盘要从某磁盘文件中读取数据,首先要定义文件输入流对象,并将文件输入流与该磁盘文件建立关联。文件建立关联。【例例】ifstream infile(“myfile1.txt”);由于由于 ifstream 类是由类是由 istream
9、类公有派生而来,因此可以使用基类类公有派生而来,因此可以使用基类 istream 中提供中提供的提取运算符的提取运算符“”以及其他完成输入操作的成员函数,从文件输入流中提取各种以及其他完成输入操作的成员函数,从文件输入流中提取各种基本类型的数据以及字符串。基本类型的数据以及字符串。【例例】infile a;(就像使用(就像使用 cin a 一样!)一样!)使用使用提取运算符提取运算符“”从文件输入流中提取从文件输入流中提取数据时,系统将自动完成数据格式上的转数据时,系统将自动完成数据格式上的转换。即:系统从文件输入流中换。即:系统从文件输入流中提取一个字符序列格式的数据,提取一个字符序列格式的
10、数据,将将字符序列格式的数字符序列格式的数据转换成据转换成内存中内部存储格式的内存中内部存储格式的数据(二进制)数据(二进制)后,再赋给后,再赋给内存中内存中对应的变量。因对应的变量。因此,此,提取运算符提取运算符“”只能用于从文本文件中读取数据,而不能用于二进制文件!只能用于从文本文件中读取数据,而不能用于二进制文件!6文件文件 I/O 流类体系流类体系lofstream 文件输出流类文件输出流类:支持将数据写入到磁盘文件中的各种操作。支持将数据写入到磁盘文件中的各种操作。要将数据写入某磁盘文件,首先要定义文件输出流对象,并将文件输出流与该磁盘文要将数据写入某磁盘文件,首先要定义文件输出流对
11、象,并将文件输出流与该磁盘文件建立关联。件建立关联。【例例】ofstream outfile(“myfile2.txt”);由于由于 ofstream 类是由类是由 ostream 类公有派生而来,因此可以使用基类类公有派生而来,因此可以使用基类 ostream 中提中提供的插入运算符供的插入运算符“”以及其他完成输出操作的成员函数,往文件输出流中插入各以及其他完成输出操作的成员函数,往文件输出流中插入各种基本类型的数据以及字符串。种基本类型的数据以及字符串。【例例】outfile a;(就像使用(就像使用 cout a 一样!)一样!)由于由于使用使用插入运算符插入运算符“”往文件输出流中插
12、入往文件输出流中插入数据时,系统将自动完成数据格式的数据时,系统将自动完成数据格式的转换。即:系统转换。即:系统将内存中要输出的数据,将内存中要输出的数据,从从内存中内部存储格式的内存中内部存储格式的数据(二进制)数据(二进制)转换成转换成字符序列格式的数据字符序列格式的数据后,再插入到后,再插入到文件输出流中文件输出流中。因此,。因此,插入运算符插入运算符“”只能用于将数据写入文本文件,而不能用于二进制文件!只能用于将数据写入文本文件,而不能用于二进制文件!lfstream 文件输入输出流类文件输入输出流类:支持对磁盘文件的读取和写入数据的各种操作。支持对磁盘文件的读取和写入数据的各种操作。
13、7文件的使用文件的使用l文件的读文件的读/写方式:写方式:只从文件中读取数据只从文件中读取数据 通过文件输入流来实现。通过文件输入流来实现。只往文件中写入数据只往文件中写入数据 通过文件输出流来实现。通过文件输出流来实现。对文件既读取又写入对文件既读取又写入 通过文件输入输出流来实现。通过文件输入输出流来实现。l文件的使用方法:文件的使用方法:定义文件流:定义文件流:根据文件的读根据文件的读/写方式,通过相应的文件流类(写方式,通过相应的文件流类(ifstream 文件输入流类、文件输入流类、ofstream 文件输出流类、文件输出流类、fstream 文件输入输出流类)定义相应的文件流。文件
14、输入输出流类)定义相应的文件流。文件的打开:文件的打开:文件使用前,必须将其打开!打开文件使用前,必须将其打开!打开文件时,系统将文件时,系统将建立关联,将该磁盘建立关联,将该磁盘文件与相应的文件流联系起来,通过文件流对其相关联的文件进行操作。文件与相应的文件流联系起来,通过文件流对其相关联的文件进行操作。文件的读文件的读/写:写:通过文件流调用相应的成员函数,对其相关联的磁盘文件进行读通过文件流调用相应的成员函数,对其相关联的磁盘文件进行读/写。写。文件的关闭:文件的关闭:文件使用后,应该将其关闭!文件使用后,应该将其关闭!关闭文件时,系统将该文件内存缓冲区中关闭文件时,系统将该文件内存缓冲
15、区中的数据写的数据写入磁盘入磁盘文件中文件中,并,并断开文件流断开文件流与与该该磁盘磁盘文件名之间所建立的关联。文件名之间所建立的关联。8文件的使用文件的使用定义文件流定义文件流l在定义文件流的同时打开文件:在定义文件流的同时打开文件:在三种文件流类中,都提供了带有缺省参数值的构在三种文件流类中,都提供了带有缺省参数值的构造函数,这样在定义文件流的同时,调用带参构造函数,打开磁盘文件建立关联。造函数,这样在定义文件流的同时,调用带参构造函数,打开磁盘文件建立关联。ifstream:ifstream(const char*,int=ios:in,int=filebuf:openprot);ofs
16、tream:ofstream(const char*,int=ios:out,int=filebuf:openprot);fstream:fstream(const char*,int ,int=filebuf:openprot );第一个参数:指定所打第一个参数:指定所打开文件的文件名及路径开文件的文件名及路径名,路径名间的名,路径名间的“”要要用连续两个,第一个表用连续两个,第一个表示转义序列开始。示转义序列开始。例如:例如:e:testaaa.txt表示:表示:e:testaaa.txt第二个参数:指定文件的打开方式,有八种,可组合使用。第二个参数:指定文件的打开方式,有八种,可组合使用
17、。ios:in /按读方式打开文件按读方式打开文件ios:out /按写方式打开文件按写方式打开文件ios:ate /打开文件时,将指针定位到文件的尾部打开文件时,将指针定位到文件的尾部ios:app /按增补方式打开输出文件,从文件开始写按增补方式打开输出文件,从文件开始写ios:trunc /将文件长度截为将文件长度截为0,并清除文件原有内容,并清除文件原有内容ios:nocreate /不允许创建新文件,只能打开已有的文件不允许创建新文件,只能打开已有的文件ios:noreplace /不允许覆盖已有的文件,只能创建新文件不允许覆盖已有的文件,只能创建新文件ios:binay /打开二进
18、制文件(默认为文本文件)打开二进制文件(默认为文本文件)第三个参数:指定第三个参数:指定打开文件时的保护打开文件时的保护方式,该参数与具方式,该参数与具体的操作系统有关,体的操作系统有关,一般情况下只使用一般情况下只使用缺省值,而不要给缺省值,而不要给出实参。出实参。9文件的使用文件的使用文件的打开文件的打开l先定义文件流,再调用先定义文件流,再调用 open()成员函数打开文件:成员函数打开文件:void ifstream:open(const char*,int=ios:in,int=filebuf:openprot);void ofstream:open(const char*,int=
19、ios:out,int=filebuf:openprot);void fstream:open(const char*,int,int=filebuf:openprot);【例例】ifstream inf;inf.open(“myf1.dat”);/以读方式打开当前目录下的文本文件以读方式打开当前目录下的文本文件myf1.dat。ofstream outf;outf.open(“myf2.dat”);/*以以写写方方式式打打开开当当前前目目录录下下的的文文本本文文件件myf2.dat。若若文文件不存在,产生一个空文件;若文件存在,删除其内容,使其成为一个空文件。件不存在,产生一个空文件;若文件
20、存在,删除其内容,使其成为一个空文件。*/fstream iof;iof.open(“e:testmyf3.dat”,ios:in|ios:out );/以可读可写方式打开以可读可写方式打开e盘盘test目录下的文本文件目录下的文本文件myf3.dat。10文件的使用文件的使用文件的打开文件的打开l打开方式的组合使用:打开方式的组合使用:ios类中声明了表示文件打开方式的类中声明了表示文件打开方式的 open_mode 枚举类型。枚举类型。enum open_mode in=0 x01,/00000001 按读方式打开文件按读方式打开文件 out=0 x02,/00000010 按写方式打开文
21、件按写方式打开文件 ate=0 x04,/00000100 打开文件时,将指针移到文件的末尾打开文件时,将指针移到文件的末尾 app=0 x08,/00001000 按增补方式打开文件按增补方式打开文件 trunc=0 x10,/00010000 将文件长度截为将文件长度截为0,并清除文件原有内容,并清除文件原有内容 nocreate=0 x20,/00100000 不允许创建新文件,只能打开已有的文件不允许创建新文件,只能打开已有的文件 noreplace=0 x40,/01000000 不允许覆盖已有的文件,只能创建新文件不允许覆盖已有的文件,只能创建新文件 binary=0 x80 ;/
22、10000000 打开二进制文件打开二进制文件l每每一一种种打打开开方方式式是是以以一一个个二二进进制制位位来来表表示示,可可以以用用运运算算符符“|”(按按位位逻逻辑辑或或)将将几几种打开方式组合起来使用。种打开方式组合起来使用。【例例】ios:out|ios:ate 以写方式打开文本文件,新写入的数据增加在文件的尾部。以写方式打开文本文件,新写入的数据增加在文件的尾部。ios:in|ios:out|ios:binary 以可读可写方式打开二进制文件。以可读可写方式打开二进制文件。11文件的使用文件的使用文件的打开文件的打开l打打开开文文件件时时,通通常常要要判判断断打打开开是是否否成成功功
23、。若若打打开开成成功功,文文件件流流本本身身值值为为true;若若打打开开失败,文件流本身值为失败,文件流本身值为false。【例例】ifstream inf(“myf1.dat”,ios:in|ios:binary|ios:nocreate );if(!inf)cout “文件打开失败,文件打开失败,myf1.dat 不存在不存在!n”;exit(1);以以 nocreate 方式打开时,若文件存在,则将其打开;若文件不存在,则打开文件失败。方式打开时,若文件存在,则将其打开;若文件不存在,则打开文件失败。ofstream outf1(“myf2.dat”,ios:out|ios:binar
24、y|ios:noreplace );if(!outf1)cout”、插入运算符、插入运算符“”用于对文本文件进行读取用于对文本文件进行读取数据数据、写入、写入数据数据。get()、getline()、put()成员函数成员函数用于对文本文件进行读取用于对文本文件进行读取字符字符、写入、写入字符字符。l二进制文件的读二进制文件的读/写:写:基类基类 istream 中中 read()成员函数成员函数用于从二进制文件中读取用于从二进制文件中读取数据数据。基类基类 ostream 中中 write()成员函数成员函数用于往二进制文件中写入用于往二进制文件中写入数据数据。13文件的使用文件的使用文件的
25、关闭文件的关闭l文件的关闭:文件的关闭:对文件的操作完成后,应及时关闭文件。关闭文件时,系统将该文件内存缓冲区中的对文件的操作完成后,应及时关闭文件。关闭文件时,系统将该文件内存缓冲区中的数据写入磁盘文件中,并断开文件流与磁盘文件之间所建立的关联,注意只是断开数据写入磁盘文件中,并断开文件流与磁盘文件之间所建立的关联,注意只是断开关联,而文件流本身并没有撤消!该文件流还可以通过关联,而文件流本身并没有撤消!该文件流还可以通过 open()函数与其他磁盘文件函数与其他磁盘文件建立关联。建立关联。三种文件流类中,都提供了关闭文件的成员函数,格式:三种文件流类中,都提供了关闭文件的成员函数,格式:v
26、oid ifstream:close();void ofstream:close();void fstream:close();【例例】inf.close();outf.close();iof.close();14文件的随机访问文件的随机访问l文件定位指针的作用:文件定位指针的作用:文件打开时,系统为其建立一个长整型变量(假设变量名为文件打开时,系统为其建立一个长整型变量(假设变量名为 point),初值为),初值为0,称,称为文件定位指针。为文件定位指针。文件的内容,可看成是若干字节组成的字节序列,从文件的内容,可看成是若干字节组成的字节序列,从 0 开始给每个字节顺序编号。开始给每个字节顺
27、序编号。可将可将point 看成是指向文件内容的定位指针,它总是指向当前要读取数据的位置!看成是指向文件内容的定位指针,它总是指向当前要读取数据的位置!从文件中读取数据时,是从第从文件中读取数据时,是从第 point 号字节开始读;往文件中写入数据时,也是从第号字节开始读;往文件中写入数据时,也是从第 point 号字节开始写,读号字节开始写,读/写的过程中定位指针写的过程中定位指针 point 自动向文件尾方向移动。自动向文件尾方向移动。l文件的顺序访问文件的顺序访问按文件中信息存放的先后顺序依次进行读按文件中信息存放的先后顺序依次进行读/写。写。l文件的随机访问文件的随机访问通过移动通过移
28、动 point 位置,可对文件中任一指定字节进行读位置,可对文件中任一指定字节进行读/写。写。l在在C+文件流类的基类文件流类的基类 istream 和和 ostream 中,提供了支持随机访问的成员函数来中,提供了支持随机访问的成员函数来移动移动 point 位置,实现对文件的随机访问。位置,实现对文件的随机访问。15文件的随机访问文件的随机访问listream 类中的成员函数:类中的成员函数:istream&istream:seekg(streampos n );功能:功能:将文件输入流中的文件指针,移动到第将文件输入流中的文件指针,移动到第 n 号字节处。号字节处。istream&ist
29、ream:seekg(streamoff n ,ios:seek_dir);功能:功能:将文件输入流中的文件指针,以第二个参数所指定位置为基准,后退或前进将文件输入流中的文件指针,以第二个参数所指定位置为基准,后退或前进移动移动 n 个字节(个字节(n为正数时为正数时前进;前进;n为负数为负数后退)。后退)。streampos istream:tellg();功能:功能:返回文件输入流中文件指针的当前位置。返回文件输入流中文件指针的当前位置。l说明:说明:三个函数名中的三个函数名中的 g 是是 get 的缩写,表示要移动的是文件输入流的指针。的缩写,表示要移动的是文件输入流的指针。stream
30、pos 和和 streamoff 相当于基本数据类型中的相当于基本数据类型中的 long int。ios:seek_dir 可取三个值:可取三个值:ios:beg 文件起始位置文件起始位置 ios:cur 文件当前位置文件当前位置 ios:end 文件结束位置文件结束位置16文件的随机访问文件的随机访问lostream 类中的成员函数:类中的成员函数:ostream&ostream:seekp(streampos n );功能:功能:将文件输出流中的文件指针,移动到第将文件输出流中的文件指针,移动到第 n 号字节处。号字节处。ostream&ostream:seekp(streamoff n
31、,ios:seek_dir );功能:功能:将文件输出流中的文件指针,以第二个参数所指定位置为基准,后退或前进将文件输出流中的文件指针,以第二个参数所指定位置为基准,后退或前进移动移动 n 个字节(个字节(n为正数时为正数时前进;前进;n为负数为负数后退)。后退)。streampos ostream:tellp();功能:功能:返回文件输出流中文件指针的当前位置。返回文件输出流中文件指针的当前位置。l说明:说明:三个函数名中的三个函数名中的 p 是是 put 的缩写,表示要移动的是文件输出流的指针。的缩写,表示要移动的是文件输出流的指针。【例例】outf.seekp(20,ios:cur);/
32、当前文件指针值后退当前文件指针值后退20个字节个字节 outf.seekp(20,ios:cur);/当前文件指针值前进当前文件指针值前进20个字节个字节 outf.seekp(-20,ios:end);/若文件尾的编号为若文件尾的编号为100,则文件指针移到,则文件指针移到80号号17文本文件的使用文本文件的使用【例例】e 盘盘 sss 目录下有文件目录下有文件 s1.txt,存有若干学生的,存有若干学生的资资料(学号、姓名、成料(学号、姓名、成绩绩)。)。要求:要求:定义定义 Student 类,并重载:类,并重载:friend bool operator(istream&,Student
33、&);friend ostream&operator(ostream&,Student&);编写编写 main()函数,完成:函数,完成:定义定义Student 数组数组s,将,将s1.txt 中的学生中的学生资资料料读读入数入数组组 s 中,按成中,按成绩绩由高到低排序。由高到低排序。将排序后的学生资料输出二份:一份输出至屏幕;一份输出至文件将排序后的学生资料输出二份:一份输出至屏幕;一份输出至文件s2.txt 中保存。中保存。在在s1.txt 中,学生资料:中,学生资料:61001 方飞飞方飞飞 9661002 巩浩文巩浩文 7261003 程可国程可国 6961004 麦宏岩麦宏岩 33
34、61005 文一奇文一奇 9761006 王碧方王碧方 9918#include#include#include#includeclass Student int id;char name 10 ;int score;public:Student(int i=0,char *na=0,int s=0 )id=i;if (na)strcpy(name,na);score=s;friend istream&operator(istream&,Student&);friend ostream&operator(ostream&,Student&);friend bool operator(istre
35、am&in ,Student&s )return in s.id s.name s.score;ostream&operator(ostream&out ,Student&s )return outsetw(12)s.idsetw(14)s.namesetw(8)s.scoreendl;bool operator(Student&s1,Student&s2 )if (s1.score s2.score )return true;else return false;19void main()ifstream inf(“e:ssss1.txt”,ios:in|ios:nocreate|ios:at
36、e );if (!inf)cout “打开文件打开文件 s1.txt 失失败败!n”;exit(1);int n=inf.tellg();inf.seekg(0);inf.ignore(80,n);n=n/inf.gcount();inf.seekg(0);Student *p=new Student n ;int i,j=0;Student t;cout “排序前:排序前:n”;for (i=0;i p i ;cout p i ;inf.close();for (i=0;in-1;i+)for (j=i+1;jn;j+)if (p i p j )t=p i ;p i =p j ;p j =t
37、;ofstream outf(“e:ssss2.txt”);cout “排序后:排序后:n”;for (i=0;in;i+)cout p i ;outf p i ;outf.close();delete p;运行:运行:排序前:排序前:61001 方飞飞方飞飞 9661002 巩浩文巩浩文 7261003 程可国程可国 6961004 麦宏岩麦宏岩 3361005 文一奇文一奇 9761006 王碧方王碧方 99排序后排序后61006 王碧方王碧方 9961005 文一奇文一奇 9761001 方飞飞方飞飞 9661002 巩浩文巩浩文 7261003 程可国程可国 6961004 麦宏岩麦宏
38、岩 3320【例例】(有(有5名学生上交的名学生上交的C+源程序文件源程序文件sc1.cpp、sc2.cpp、,编写程序将这些文,编写程序将这些文件都拷入供教师批阅的文本文件件都拷入供教师批阅的文本文件 tsc.txt 中。)中。)#include#includevoid main()char fname 12 =“sc1.cpp”,s 100 ;ifstream inf;ofstream outf(“tsc.txt”);for (char n=1;n=5;n+)fname 2 =n;inf.open(fname,ios:in|ios:nocreate);if (!inf)cout “无法打开
39、文件无法打开文件”fname “!n”;inf.clear();continue;outf “nFrom:”fname endl;while(inf.getline(s,100)outf s endl;inf.close();outf.close();假设学生上交的文件有:假设学生上交的文件有:sc1.cpp 文件内容为:文件内容为:11111111111111AAAAAAAAAAAsc3.cpp 文件内容为:文件内容为:33333333333333CCCCCCCCCCCsc4.cpp 文件内容为:文件内容为:44444444444444若只交了以上三个文件,若只交了以上三个文件,则运行后显示
40、器上输出:则运行后显示器上输出:无法打开文件无法打开文件sc2.cpp!无法打开文件无法打开文件sc5.cpp!文件文件 tsc.txt 中内容为:中内容为:From:sc1.cpp11111111111111AAAAAAAAAAA From:sc3.cpp33333333333333CCCCCCCCCCCFrom:sc4.cpp4444444444444421二进制文件的使用二进制文件的使用l二进制文件的读操作二进制文件的读操作 通过通过 read()成员函数实现成员函数实现 格式:格式:istream&istream:read(char*,int );istream&istream:rea
41、d(unsigned char*,int );istream&istream:read(signed char*,int );功能:功能:从二进制文件中读取指定字节数的内容(字节数由第二个参数指定),直接从二进制文件中读取指定字节数的内容(字节数由第二个参数指定),直接存入指定的内存单元(内存单元起始地址由第一个参数指定)。存入指定的内存单元(内存单元起始地址由第一个参数指定)。l二进制文件的写操作二进制文件的写操作 通过通过 write()成员函数实现成员函数实现 格式:格式:ostream&ostream:write(const char*,int );ostream&ostream:wr
42、ite(const unsigned char*,int );ostream&ostream:write(const signed char*,int );功能:功能:从指定的内存单元(内存单元起始地址由第一个参数指定)读取指定字节数从指定的内存单元(内存单元起始地址由第一个参数指定)读取指定字节数的内容(字节数由第二个参数指定),的内容(字节数由第二个参数指定),直接写入二进制文件中。直接写入二进制文件中。22二进制文件的使用二进制文件的使用l几点说明:几点说明:在在 read()、write()函数中,第一个参数指定的是内存单元的起始地址,其类型是函数中,第一个参数指定的是内存单元的起始地
43、址,其类型是字符型指针!因此,若对二进制文件读取字符型指针!因此,若对二进制文件读取/写入的是非字符类型的数据(如整型、实写入的是非字符类型的数据(如整型、实型、构造的数据类型),其对应的内存单元地址(指针)也必然是非字符类型的指型、构造的数据类型),其对应的内存单元地址(指针)也必然是非字符类型的指针,而作为针,而作为 read()、write()函数的第一个参数时,必须强制转换成字符类型的指函数的第一个参数时,必须强制转换成字符类型的指针,即在该实参前面加上(针,即在该实参前面加上(char*)。使用使用 read()、write()函数,在对二进制文件进行读取、写入数据时,不作任何数函数
44、,在对二进制文件进行读取、写入数据时,不作任何数据格式上的转换,即:二进制文件与内存单元之间,直接进行数据的传送!据格式上的转换,即:二进制文件与内存单元之间,直接进行数据的传送!从文件中读取数据时,通常不知道文件中有多少数据,需要测试是否到达文件结束位从文件中读取数据时,通常不知道文件中有多少数据,需要测试是否到达文件结束位置,可使用置,可使用 eof()成员函数实现,其原型为:成员函数实现,其原型为:int ios:eof();功能是:当到达文功能是:当到达文件结束位置时,该函数返回非件结束位置时,该函数返回非 0 值,否则返回值,否则返回 0 值。值。23【例例】(将(将 32 39 的
45、整数中,能被的整数中,能被 3 或或 5 整除的数写入文本文件整除的数写入文本文件 my1.dat 中、也写中、也写入二进制文件入二进制文件 my2.dat 中。然后用记事本分别打开这两个文件,进行观察比较。)中。然后用记事本分别打开这两个文件,进行观察比较。)#include#includevoid main()ofstream outf1(“my1.dat”);if (!outf1)cout “不能打开文件不能打开文件 my1.dat!n”;exit(1);ofstream outf2(“my2.dat”,ios:out|ios:binary );if (!outf2)cout “无法打开
46、文件无法打开文件 my2.dat!n”;exit(1);for (int i=32;i=39;i+)if (i%3=0|i%5=0 )outf1 i “”;outf2.write(char*)&i ,sizeof(int);outf1.close();outf2.close();在记事本中打开在记事本中打开 my2.dat 文件文件,内容为:,内容为:!#$NULNULNULNULNULNULNULNULNULNULNULNUL在记事本中打开在记事本中打开 my1.dat 文件文件,内容为:,内容为:33 35 36 3924【例例】(从上例所产生的二进制文件(从上例所产生的二进制文件 my2
47、.dat 中读取数据,并输出在显示器上。)中读取数据,并输出在显示器上。)#include#includevoid main()ifstream inf(“my2.dat”,ios:in|ios:binary|ios:nocreate );if (!inf)cout “无法打开文件无法打开文件 my2.dat!n”;exit(1);int k,n=0;cout “读读取取 my2.dat 文件,内容文件,内容为为:n”;inf.read(char*)&k ,sizeof(int);while(!inf.eof()cout k “”;inf.read(char*)&k ,sizeof(int);
48、cout endl;inf.close();以上以上 while 语语句也可写句也可写为为:while (inf.read(char*)&k ,sizeof(int)cout k “”;读取读取 my2.dat 文件,内容为:文件,内容为:33 35 36 3925【例例】(对上例所产生的二进制文件(对上例所产生的二进制文件my2.dat,采取一次性将数据全部读完。),采取一次性将数据全部读完。)#include#include#includevoid main()ifstream inf(“my2.dat”,ios:in|ios:binary|ios:nocreate|ios:ate);if
49、 (!inf)cout “无法打开文件无法打开文件 my2.dat!n”;exit(1);int n=inf.tellg()/sizeof(int);int *p=new int n ;inf.seekg(0);inf.read(char*)p ,n*sizeof(int);cout “读读取取 my2.dat 文件,内容文件,内容为为:n”;for(int i=0;in;i+)cout p i “”;cout endl;delete p;inf.close();读取读取 my2.dat 文件,内容为:文件,内容为:33 35 36 3926数据文件与对象数据文件与对象l对存放在文件中的数据进
50、行处理:对存放在文件中的数据进行处理:在面向对象程序设计中,要对某些数据进行处理在面向对象程序设计中,要对某些数据进行处理时,总是先将这些数据读入到对象的成员数据中,再对其进行处理,而这些数据通时,总是先将这些数据读入到对象的成员数据中,再对其进行处理,而这些数据通常需要长期保存,即在处理前、处理后通常要求保存在磁盘文件中。常需要长期保存,即在处理前、处理后通常要求保存在磁盘文件中。l规范的面向对象编程方法:规范的面向对象编程方法:在程序在程序开始运行时开始运行时,可打开原始数据文件来初始化新对,可打开原始数据文件来初始化新对象的成员数据。在程序象的成员数据。在程序运行过程中运行过程中,是对存