第 9 章(2)━━输入输出流.ppt
《第 9 章(2)━━输入输出流.ppt》由会员分享,可在线阅读,更多相关《第 9 章(2)━━输入输出流.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 章2输入输出流 输入输出
限制150内