1、 I/O流、读写文件流、读写文件和串行化和串行化面向对象技术与Visual C+-第7章2主要内容主要内容n流的概念流的概念 n非格式化输入非格式化输入/输出输出 n格式化输入格式化输入/输出输出nC+中对文件的操作中对文件的操作nMFC中提供的对文件操作的类中提供的对文件操作的类n文档类中的操作文档类中的操作n图形的保存图形的保存面向对象技术与Visual C+-第7章3流的概念流的概念 n所谓所谓“流流”,是从源,是从源(source)到矢到矢(sink)的数的数据流的一个抽象。据流的一个抽象。流动的方向不同,构成输入流动的方向不同,构成输入/输出流,即输出流,即I/O流。流。n数据可以从
2、文件流入到程序,也可以从程序流数据可以从文件流入到程序,也可以从程序流向文件。键盘、屏幕、打印机和通信端口都可向文件。键盘、屏幕、打印机和通信端口都可看作是扩充文件。看作是扩充文件。q从流中获取数据的操作称为从流中获取数据的操作称为提取操作提取操作q向流中添加数据的操作称为向流中添加数据的操作称为插入操作插入操作。n数据的输入数据的输入/输出就是通过输出就是通过I/O流来实现的。流来实现的。面向对象技术与Visual C+-第7章4nI/O流类库流类库n预定义了预定义了4个流类对象个流类对象qcin 处理标准输入处理标准输入 qcout 处理标准输出处理标准输出qcerr 处理标准错误输出处理
3、标准错误输出(非缓冲方式非缓冲方式)qclog 处理标准错误输出处理标准错误输出(缓冲方式缓冲方式)ostream类类istream类类流的概念流的概念 面向对象技术与Visual C+-第7章5非格式化输入非格式化输入/输出输出 n定义:按系统预定义的格式进行的输入定义:按系统预定义的格式进行的输入/输出。输出。n如何实现:如何实现:qcin用来处理标准输入,即键盘输入;用来处理标准输入,即键盘输入;qcout用来处理标准输出,即屏幕输出。它们被定义用来处理标准输出,即屏幕输出。它们被定义在在iostream.h头文件中。头文件中。q在使用在使用cout和和cin前,要用编译预处理命令将所使
4、前,要用编译预处理命令将所使用的头文件包含到源程序中,其格式如下:用的头文件包含到源程序中,其格式如下:#include#include 面向对象技术与Visual C+-第7章6非格式化输出非格式化输出 n使用使用cout的格式如下:的格式如下:coutE1E2Em;其中,其中,E1、E2、Em为均为表达式。功能是为均为表达式。功能是计算各表达式的值,并将结果输出到屏幕当前光计算各表达式的值,并将结果输出到屏幕当前光标位置处。标位置处。n插入符插入符(V1V2Vn;其中,其中,V1、V2、Vn都是变量。都是变量。功能:暂停执行程序,等待用户从键盘输入功能:暂停执行程序,等待用户从键盘输入数据
5、,各数据间用数据,各数据间用空格空格或或Tab键键分隔,输入数分隔,输入数据类型要与接受变量类型一致,输完后,按回据类型要与接受变量类型一致,输完后,按回车键结束。车键结束。n提取符提取符()重载重载面向对象技术与Visual C+-第7章8格式化输入格式化输入/输出输出 n定义:按特定的格式进行输入定义:按特定的格式进行输入/输出。输出。例如,设定输出宽度、输出精度等。例如,设定输出宽度、输出精度等。nC+提供了两种进行输入提供了两种进行输入/输出格式化的方法:输出格式化的方法:q用用ios类类成员函数成员函数进行格式化。进行格式化。q用专门的用专门的操作符函数操作符函数进行格式化。进行格式
6、化。面向对象技术与Visual C+-第7章9 文件的输入文件的输入/输出输出 n 根据数据的组织形式,可分为根据数据的组织形式,可分为文本文件文本文件和和二进二进制文件制文件。nC+有三种文件流类:有三种文件流类:ifstream 从从istream派生派生 提供文件输入操作提供文件输入操作 ofstream 从从ostream派生派生 提供文件输出操作提供文件输出操作 fstream 从从iostream派生派生 提供文件输入提供文件输入/输出输出 双向操作双向操作n这些文件流类都定义在这些文件流类都定义在fstream.h头文件中头文件中面向对象技术与Visual C+-第7章10文件操
7、作的一般步骤文件操作的一般步骤 1.为文件定义一个流类对象;为文件定义一个流类对象;2.使用成员函数使用成员函数open()打开文件;打开文件;3.进行读写操作。即输入进行读写操作。即输入/输出操作;输出操作;4.使用成员函数使用成员函数close()关闭文件。关闭文件。面向对象技术与Visual C+-第7章11MFC中提供的对文件操作的类中提供的对文件操作的类nCFile类类 构造函数、构造函数、Write、ReadnCArchive类类 可将一个复杂的对象以二进制形式永久保存到可将一个复杂的对象以二进制形式永久保存到硬盘中,以后可再从永久存储中加载数据。这一硬盘中,以后可再从永久存储中加
8、载数据。这一过程称过程称“串行化串行化”。构造函数、构造函数、和和n文档类中的操作文档类中的操作 Serialize:当打开文件或保存文件时,会调:当打开文件或保存文件时,会调用该函数。用该函数。面向对象技术与Visual C+-第7章12图形的保存图形的保存n生成一个可串行化的类生成一个可串行化的类1.让你的类从让你的类从CObject派生派生2.覆盖覆盖Serialize成员函数成员函数3.在类声明中使用在类声明中使用Declare_Serial宏宏4.定义一个不带参的构造函数定义一个不带参的构造函数5.在类实现文件中使用在类实现文件中使用IMPLEMENT_SERIAL宏。宏。面向对象技
9、术与Visual C+-第7章13图形的保存图形的保存n由文档类暂存图形数据由文档类暂存图形数据n改写文档类的改写文档类的Serialize函数函数n堆上分配的内存释放堆上分配的内存释放 在在DeleteContents中释放。中释放。面向对象技术与Visual C+-第7章14String Table中中IDR_MAINFRAME字字符串资源中各子串的含义符串资源中各子串的含义n(1)CDocTemplate:windowTitle,主窗口标题栏上的字符串,MDI程序不需要指定,将以IDR_MAINFRAME字符串为默认值。n(2)CDocTemplate:docName,缺省文档的名称。如
10、果没有指定,缺省文档的名称是无标题。n(3)CDocTemplate:fileNewName,文档类型的名称。如果应用程序支持多种类型的文档,此字符串将显示在File/New对话框中。如果没有指定,就不能够在File/New对话框处理这种文件。面向对象技术与Visual C+-第7章15String Table中中IDR_MAINFRAME字字符串资源中各子串的含义符串资源中各子串的含义n(4)CDocTemplate:filterName,文档类型的描述和一个适用于此类型的通配符过滤器。这个字符串将出现在“File/Open”对话框中的文件类型列表框中。要和CDocTemplate:filt
11、erExt一起使用。n(5)CDocTemplate:filterExt,文档的扩展名。如果没有指定,就不能够在“File/Open”对话框中处理这种文档。要和CDocTemplate:filterName一起使用。n(6)CDocTemplate:regFileTypeId,如果你以:RegisterShellFileTypes向系统的注册表注册文件类型,此值会出现在HEY_CLASSES_ROOT之下成为其子项,并仅供Windows内部使用。如果没有指定,这种文件类型就无法注册。n(7)CDocTemplate:regFileTypeName,这也是存储在注册表中的文件类型名称。它会显示于
12、程序中用以访问注册表的对话框内。面向对象技术与Visual C+-第7章16n在在C+中,打开一个文件就是将此文件与一个流中,打开一个文件就是将此文件与一个流建立关联;关闭一个文件就是取消这种关联。建立关联;关闭一个文件就是取消这种关联。nopen()函数的原型为:函数的原型为:void open(char*filename,int mode,int access);说明:第一个参数是文件名,可包含路径;第二个参说明:第一个参数是文件名,可包含路径;第二个参数的值决定文件的使用方式,见表数的值决定文件的使用方式,见表7-4;第三个参数;第三个参数的值决定文件的访问方式。表的值决定文件的访问方式
13、。表7-5。mode有缺省值:对类有缺省值:对类ifstream是是ios:in;对;对ofstream是是ios:out access的缺省值为的缺省值为0(一般文件)(一般文件)打开文件打开文件 面向对象技术与Visual C+-第7章17n关闭文件的一般格式如下:关闭文件的一般格式如下:.close();说明:说明:close()不带任何参数,也没有返回值。不带任何参数,也没有返回值。其功能是:使流对象和文件脱离关联。其功能是:使流对象和文件脱离关联。n也可以通过流类的析构函数实现同样功能。也可以通过流类的析构函数实现同样功能。但通常,操作完成时应马上关闭文件,以免但通常,操作完成时应马
14、上关闭文件,以免误操作。误操作。关闭文件关闭文件 面向对象技术与Visual C+-第7章18#include#include class three_dclass three_dint x,y,z;int x,y,z;public:public:three_d(int a,int b,int c)x=a;y=b;z=c;three_d(int a,int b,int c)x=a;y=b;z=c;friend ostream&operator(ostream&stream,three_d obj);friend ostream&operator(ostream&stream,three_d o
15、bj);ostream&operator(ostream&stream,three_d obj)ostream&operator(ostream&stream,three_d obj)streamobj.x,;streamobj.x,;streamobj.y,;streamobj.y,;streamobj.zn;streamobj.zn;return stream;return stream;void main()void main()three_d a(1,2,3),b(3,4,5),c(5,6,7);three_d a(1,2,3),b(3,4,5),c(5,6,7);coutabc;co
16、utabc;面向对象技术与Visual C+-第7章19#include#include void main()void main()int i;int i;i=cout.width();/i=cout.width();/返回当前的输出宽度,默认为返回当前的输出宽度,默认为0 0coutwidth:iendl;coutwidth:iendl;cout.width(8);/cout.width(8);/设置输出宽度为设置输出宽度为8 8coutcout.width()(new width)endl;coutcout.width()(new width)endl;面向对象技术与Visual C+-
17、第7章20#include#include#include#include void main()void main()char char*p=12345,p=12345,*q=678;q=678;char f10,g10;char f10,g10;int i=10;int i=10;coutpsetw(6)qsetw(4)pqendl;coutpsetw(6)qsetw(4)pqsetw(4)fg;/cinsetw(4)fg;/设置输入宽度设置输入宽度 coutfendlgendli:iendl;coutfendlgendli:iendl;面向对象技术与Visual C+-第7章21ofst
18、ream out;/ofstream out;/定义输出流类对象定义输出流类对象out.open(out.open(“testtest”,ios:out,0);/,ios:out,0);/也可简写为也可简写为 out.open(out.open(“testtest”););ifstream in;/ifstream in;/定义输入流类对象定义输入流类对象in.open(in.open(“testtest”,ios:in,0);/,ios:in,0);/也可简写为也可简写为 in.open(in.open(“testtest”););fstream mystream;/fstream myst
19、ream;/定义输入定义输入/输出流类对象输出流类对象mystream.open(mystream.open(“testtest”,ios:in|ios:out,0);,ios:in|ios:out,0);说明:说明:1、如果打开失败,则流类对象的值为、如果打开失败,则流类对象的值为0。因此使用文件前,先测试一下。因此使用文件前,先测试一下是否打开成功。是否打开成功。2、ifstream、ofstream和和fstream类都有构造函数,与类都有构造函数,与open()函数具有函数具有相同的参数和缺省值,因此,也可调用构造函数来打开文件。如:相同的参数和缺省值,因此,也可调用构造函数来打开文件。如:ifstream mystream(“myfile”);ofstream mystream(“myfile”);面向对象技术与Visual C+-第7章22#include void main()ofstream ostrm;/定义流类对象定义流类对象ostrm.open(f1.dat);/打开文件打开文件ostrm120endl;/写操作写操作ostrm310.85nd;/读操作读操作coutn,dendl;istrm.close();/关闭文件关闭文件
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。