版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7讲讲 基于基于C+流类库的文件输入输出流类库的文件输入输出2本讲主要内容本讲主要内容C+的输入输出系统的输入输出系统基于基于C+流类库的文本文件的读写流类库的文本文件的读写基于基于C+流类库的二进制文件的读写流类库的二进制文件的读写C+程序的结构(略)程序的结构(略)3C+的输入输出系统的输入输出系统4面向对象的输入输出系统面向对象的输入输出系统C+完全支持完全支持C语言的输入输出系统,并且还语言的输入输出系统,并且还定义了一套面向对象的输入输出系统。定义了一套面向对象的输入输出系统。C+提供的用于输入输出的类体系可以:提供的用于输入输出的类体系可以:进行系统预定义类型的输入输出;进行系
2、统预定义类型的输入输出;进行程序员自定义类型的输入输出。进行程序员自定义类型的输入输出。 C+的的I/O流类,是最常用的流类,是最常用的I/O系统。系统。 5C+的流及流类库的流及流类库1 什么是什么是C+的流的流(stream) ? #include void main( ) char s10; cins; cout实现,即输入)实现,即输入)向流中添加数据称为插入操作(在向流中添加数据称为插入操作(在C+中用中用插入符插入符实现,即输出)实现,即输出) 83C+的流类库的流类库 将完成输入将完成输入/输出操作的类称为流类输出操作的类称为流类,由流类,由流类组成了流类库,组成了流类库,C+流
3、类库是用继承方法组流类库是用继承方法组织起来的一个织起来的一个输入输出类库输入输出类库。 ios类用来提供一些关于对流状态进行设置的类用来提供一些关于对流状态进行设置的功能,功能,ios类及其派生类为用户提供使用流类及其派生类为用户提供使用流类的接口类的接口;streambuf类是为类是为ios类及其派生类提供对数类及其派生类提供对数据的缓冲支持。据的缓冲支持。 9流类库的基本结构流类库的基本结构 iosstreambufistreamostreamiostreamios是个虚基类。提供流的格式化输入/输出操作成员函数和错误处理成员函数。istream 提供流的输入操作(提取操作)的成员函数。
4、 ostream 提供流的输出操作(插入操作)的成员函数。 iostream 支持对同一个流同时进行输入/输出操作(提取操作和插入操作)。streambuf 管理流的缓冲区。 10支持文件的流类支持文件的流类 iosstreambufistreamostreamiostreamfstreambase filebuf ifstream ofstream fstream fstreambase 文件流的共同基类,定义了流与文件的连接,文件操作中不使用这个类; ifstream 用于读文件(对文件进行提取操作)ofstream 用于写文件(对文件进行插入操作) fstream 用于文件的读/写操作(
5、对文件进行提取操作和文件进行插入操作);filebuf 管理文件操作的缓冲区,用来作上述类的缓冲支持; 11头文件头文件所有使用文件流类库的程序必须有:所有使用文件流类库的程序必须有: # include 12支持预定义的流类支持预定义的流类 iosstreambufistreamostreamiostreamistream_withassign ostream_withassign iostream_withassignwithassign定义了流与设备相关联的操作istream_withassign支持预定义输入操作ostream_withassign 支持预定义输出操作iostream_
6、withassign支持预定义输入/输出操作13_withassign类的对象类的对象常用的标准输入输出流常用的标准输入输出流cin、cout、cerr、clog是在是在iostream.h中说明的中说明的_withassign类的对象:类的对象:istream_withassign cin; /与标准输入设备相关联与标准输入设备相关联ostream_withassign cout; /与标准输出设备相关联与标准输出设备相关联ostream_withassign cerr; /与标准错误输出设与标准错误输出设备相关联(提供不带缓冲区的输出)备相关联(提供不带缓冲区的输出)ostream_wit
7、hassign clog; /与标准错误输出设与标准错误输出设备相关联(提供带缓冲区的输出)备相关联(提供带缓冲区的输出) 144I/O 流在流在C+中所起的作用中所起的作用 操作系统将键盘、屏幕、打印机和通讯接口作操作系统将键盘、屏幕、打印机和通讯接口作为扩充文件来处理的;为扩充文件来处理的;I/O流类就是用来与这些扩充文件进行交互的,流类就是用来与这些扩充文件进行交互的,实现数据的输入和输出。实现数据的输入和输出。 15基于基于C+流类库的文本文件的读写流类库的文本文件的读写16【例6-1】文本文件的读写。为案例程序增加文本文件的读写。为案例程序增加文件保存功能。将文件保存功能。将“学生学
8、生”对象的数据保存到对象的数据保存到文件中。文件中。【分析分析】案例程序定义的各种类对象存在于内存中,案例程序定义的各种类对象存在于内存中,需要使用需要使用C+输入输出类库提供的相关函数,将输入输出类库提供的相关函数,将内存数据永久保存到文件中,再将文件中的数据内存数据永久保存到文件中,再将文件中的数据读入到内存中的相应对象中。读入到内存中的相应对象中。 文件的操作过程为:文件的操作过程为:打开文件打开文件读写文件读写文件关闭文件关闭文件17【程序编写程序编写】读写学生对象的数据,需要为读写学生对象的数据,需要为CStudent类类添加相应的添加相应的读写成员函数读写成员函数。按照案例程序的类
9、层次关系和各种属性数据按照案例程序的类层次关系和各种属性数据所在所在 的类层次,的类层次,读写成员函数读写成员函数应该添加到应该添加到 CStudent类的基类类的基类CPerson类中,之后继类中,之后继承到承到CStudent类中。类中。在在Person.h文件中添加成员函数声明:文件中添加成员函数声明:/数据写入文件数据写入文件virtual void WriteFile(ofstream &fs); /从文件中读取数据从文件中读取数据virtual void ReadFile(ifstream &fs); 在在Person.cpp文件中添加成员函数定义:文件中添加成员函数定义:void
10、 CPerson:WriteFile(ofstream &fs) /数据写入文件数据写入文件fsm_strNamenm_strID m_cSex m_Birthday.GetYear() m_Birthday.GetMonth() m_Birthday.GetDay() ;输出文件流类输出文件流类输入文件流类输入文件流类利用利用插入运算符插入运算符strIDm_cSexnYearnMonthnDay;delete m_strName;m_strName = new charstrlen(strName)+1;strcpy(m_strName, strName);delete m_strID;m
11、_strID = new charstrlen(strID)+1;strcpy(m_strID, strID);CDate Birthday(nYear, nMonth, nDay);m_Birthday = Birthday;从输入文件流从输入文件流fs中读中读取取1行信息行信息;getline是是fs对象的成对象的成员函数员函数利用提取运算符从输入利用提取运算符从输入文件流文件流fs中读取信息中读取信息在在Student.h文件中添加成员函数声明:文件中添加成员函数声明:/数据写入文件数据写入文件void WriteFile(ofstream &fs); /从文件中读取数据从文件中读取数据
12、void ReadFile(ifstream &fs); 在在Student.cpp文件中添加成员函数定义:文件中添加成员函数定义:void CStudent:WriteFile(ofstream &fs)/利用插入运算符将学生属性信息写到输出文件流利用插入运算符将学生属性信息写到输出文件流fs中中CPerson:WriteFile(fs);fs m_strMajorendl;重新定义从父类那里重新定义从父类那里继承下来的成员函数继承下来的成员函数利用利用插入运算符插入运算符将学生属将学生属性信息写到输出文件流性信息写到输出文件流fsfs中中调用调用“父类版本父类版本”的的成员函数成员函数vo
13、id CStudent:ReadFile(ifstream &fs)char strMajor256; CPerson:ReadFile(fs);fs.getline(strMajor, 256); /从输入文件流从输入文件流fs中读取中读取1行信息行信息delete m_strMajor;m_strMajor = new charstrlen(strMajor)+1;strcpy(m_strMajor, strMajor); 调用调用“父类版本父类版本”的的成员函数成员函数22main()函数函数【读写步骤读写步骤】1.定义定义3个学生对象个学生对象Student1、Student2和和St
14、udent3;2. 打开文件打开文件,将这些学生对象的信息将这些学生对象的信息以文本数据的形以文本数据的形式式写入写入文本文件文本文件StudentInfo.txt;关闭文件。关闭文件。3. 再次打开文件,读取再次打开文件,读取StudentInfo.txt文件,将文文件,将文件中的数据读入到内存,存放到件中的数据读入到内存,存放到3个学生对象个学生对象Student1_1、Student2_1和和Student3_1中,输中,输出出3个学生对象个学生对象Student1_1、Student2_1和和Student3_1的数据。关闭文件。的数据。关闭文件。int main()CStudent
15、Student1(李江李江, 50200900825, 0, 1991, 3, 7, 计算机科学与技术计算机科学与技术);CStudent Student2(赵梅赵梅, 50200900826, 1, 1991, 6, 8, 计算机科学与技术计算机科学与技术);CStudent Student3(武峰武峰, 50200900827, 0, 1990, 5, 6, 计算机科学与技术计算机科学与技术);ofstream fout(StudentInfo.txt);if(fout.fail()coutOpen file failture!endl;return 1;Student1.WriteFil
16、e(fout);Student2.WriteFile(fout);Student3.WriteFile(fout);fout.close();定义输出文件流对象定义输出文件流对象fout并通过它打开或创建文件并通过它打开或创建文件StudentInfo.txt如果文件打开或创建如果文件打开或创建失败,则退出失败,则退出将学生的信息写到输将学生的信息写到输出文件流对象出文件流对象fout中中关闭文件关闭文件ifstream fin(StudentInfo.txt);if(fin.fail()coutOpen file failture!endl;return 1;CStudent Student
17、1_1, Student2_1, Student3_1;Student1_1.ReadFile(fin);Student2_1.ReadFile(fin);Student3_1.ReadFile(fin);fin.close();Student1_1.DisplayInfo();Student2_1.DisplayInfo();Student3_1.DisplayInfo(); return 0; 定义输入文件流对象定义输入文件流对象fin并通过它打开文件并通过它打开文件StudentInfo.txt关闭文件关闭文件输出学生信息输出学生信息如果文件打开失败,则退出如果文件打开失败,则退出将输入
18、流文件对象将输入流文件对象fin中中的数据读到学生对象中的数据读到学生对象中25程序的运行结果如下。程序的运行结果如下。如果用记事本程序打开文本文件如果用记事本程序打开文本文件“StudentInfo.txt”,就会看到下图所示的内容。就会看到下图所示的内容。261. C+的文件流类的文件流类C+提供了提供了3个用于文件输入输出的文件流类,如下个用于文件输入输出的文件流类,如下所示。所示。 ifstream:输入文件流类,用于文件的输入。输入文件流类,用于文件的输入。 ofstream:输出文件流类,用于文件的输出。输出文件流类,用于文件的输出。 fstream:输入输入/输出文件流类,用于文
19、件的输入输出文件流类,用于文件的输入/输出。输出。在使用这些文件流类时,通常要在程序中包含头在使用这些文件流类时,通常要在程序中包含头文件文件fstream: #include 27在利用文件流类进行文件操作时,首先要在利用文件流类进行文件操作时,首先要建立建立流类的对象流类的对象。例如:例如:ifstream fin;ofstream fout;fstream fin_out;2. 文件流类对象的定义文件流类对象的定义28(1) 可以可以通过流类对象的构造函数打开文件通过流类对象的构造函数打开文件。例如:例如:ofstream fout(StudentInfo.txt); 该语句定义了输出文
20、件流类的对象该语句定义了输出文件流类的对象fout,并通过其构,并通过其构造函数打开文件造函数打开文件StudentInfo.txt。再如:再如:ifstream fin(StudentInfo.txt);该语句定义了输入文件流类的对象该语句定义了输入文件流类的对象fin,并通过其构,并通过其构造函数打开文件造函数打开文件StudentInfo.txt。 3. 打开文件的方法打开文件的方法29(2) 可以通过文件流对象的成员函数可以通过文件流对象的成员函数open打开文打开文件调用该函数的一般形式为:件调用该函数的一般形式为: 文件流对象文件流对象.open(文件名文件名, 打开方式打开方式)
21、;其中,其中,“文件名文件名”可以包括路径(如可以包括路径(如“D:dataStudentInfo.txt”),如果不指明路),如果不指明路径,则默认为当前目录下的文件。径,则默认为当前目录下的文件。 “打开方式打开方式”决定如何打开文件,如表决定如何打开文件,如表6-1所所示。示。3. 打开文件的方法打开文件的方法30表表6-1 文件的打开方式文件的打开方式方式方式功能功能ios:app打开一个输出文件,以将数据添加到文件的尾部打开一个输出文件,以将数据添加到文件的尾部ios:ate打开一个已存文件,并将文件指针移到文件的尾打开一个已存文件,并将文件指针移到文件的尾部部ios:binary
22、以二进制的形式打开文件,默认值为文本文件形以二进制的形式打开文件,默认值为文本文件形式式ios:in打开一个文件,进行文件输入操作打开一个文件,进行文件输入操作ios:out打开一个文件,进行文件输出操作打开一个文件,进行文件输出操作ios:trunc 打开一个文件,如果该文件已存在,则清除文件打开一个文件,如果该文件已存在,则清除文件的内容,文件的长度变为零。的内容,文件的长度变为零。31如果用如果用ifstream类来定义一个流对象,则类来定义一个流对象,则隐含为输隐含为输入流入流,不必再添加,不必再添加ios:in说明;如果用说明;如果用ofstream类来定义一个流对象,则类来定义一个
23、流对象,则隐含为输出流隐含为输出流,不必再,不必再添加添加ios:out说明。说明。例如:例如:ifstream in;in.open(test.dat); /等同于等同于in.open(test.dat, ios:in);ifstream out;out.open(test.dat); /等同于等同于out.open(test.dat, ios:out)32如果文件打开时需要多种打开方式的组合,则应如果文件打开时需要多种打开方式的组合,则应使用使用“|”(位或操作符)将几种打开方式组合在(位或操作符)将几种打开方式组合在一起。一起。例如,可采用以下方式打开一个能够进行输入和输例如,可采用以下
24、方式打开一个能够进行输入和输出的二进制文件。出的二进制文件。fstream fin_out;fin_out.open(test.dat, ios:in|ios:out|ios:binary);当指定当指定“ios:out”方式后,隐含为方式后,隐含为“ios:trunc”方式,即如果打开的输出文件已存在,则自动清方式,即如果打开的输出文件已存在,则自动清空该文件的内容。空该文件的内容。33“打开文件打开文件”的常规写法的常规写法在进行文件打开操作时,应该判断文件打开是在进行文件打开操作时,应该判断文件打开是否成功,其常规写法如下。否成功,其常规写法如下。if(fout.fail()coutOp
25、en file failture!endl;fail函数函数是是ios类类(ios类是类是fstream、ifstream、ofstream的祖先类的祖先类)的成员函数。在这里,的成员函数。在这里,当返回值为当返回值为true时,说明时,说明“文件打开文件打开”出现出现错误。错误。344. 文本文件的读写文本文件的读写前面的程序中,从文件流读取数据时用到了前面的程序中,从文件流读取数据时用到了getline函数:函数: fs.getline(strName, 256);函数函数getline的原型是:的原型是: getline(char* _Str, int _Count)该函数的功能是:从文
26、件流中读取该函数的功能是:从文件流中读取_Count个字节到个字节到_Str所指的内存中,如果还没有读取所指的内存中,如果还没有读取_Count个字个字节就遇到回车符节就遇到回车符n,则读取过程中止。,则读取过程中止。355. 文件的关闭文件的关闭读写文件的操作完成后,应关闭文件。通过关读写文件的操作完成后,应关闭文件。通过关闭操作,文件流对象与相应的物理文件进行闭操作,文件流对象与相应的物理文件进行了脱离。了脱离。如果不进行文件的关闭,则可能造如果不进行文件的关闭,则可能造成文件数据的丢失。成文件数据的丢失。关闭文件可使用流类的成员函数关闭文件可使用流类的成员函数close完成,完成,例如:
27、例如:fout.close();fin.close();36课程案例设计与编码课程案例设计与编码(课堂练习(课堂练习1)37课堂练习:文本文件的保存课堂练习:文本文件的保存继续为案例程序增加文件保存功能。将继续为案例程序增加文件保存功能。将“本科生本科生”对象和对象和“研究生研究生”对象的数据分别保存到其各自对象的数据分别保存到其各自的文件中。的文件中。要求:案例程序中已经完成了要求:案例程序中已经完成了CPerson类、类、CStudent类的数据的保存功能,请同学们添加类的数据的保存功能,请同学们添加CUndergraduate类和类和CGraStudent类的数据保存类的数据保存功能。功
28、能。并在并在main()函数中定义相应的类对象,将其数据写函数中定义相应的类对象,将其数据写入文件,并读出和显示。入文件,并读出和显示。38基于基于C+流类库的二进制文件的读写流类库的二进制文件的读写39二进制文件的读写二进制文件的读写如果需要读写二进制文件,则在打开文件如果需要读写二进制文件,则在打开文件时要使用时要使用“ios:binary”来指定以二进制的来指定以二进制的形式进行文件流的操作。形式进行文件流的操作。读写二进制文件可使用读写二进制文件可使用get()、put()函数或函数或read()、write()函数。函数。下面使用下面使用read()、write()函数改写例函数改写
29、例6-1,实,实现现二进制文件的读写二进制文件的读写,之后介绍,之后介绍get()、put()函数的使用方法。函数的使用方法。 40使用使用write()和和read()函数读写二进制文件函数读写二进制文件【例6-2】 二进制文件的读写。二进制文件的读写。在例在例6-1的代码基础上修改程序,将学生信息的代码基础上修改程序,将学生信息写入二进制文件,再从二进制文件中读出学写入二进制文件,再从二进制文件中读出学生信息并进行显示。生信息并进行显示。修改修改CPerson类和类和CStudent类的成员函数类的成员函数WriteFile()和和ReadFile()。将将Person.cpp文件中的成员
30、函数文件中的成员函数WriteFile()重新定义重新定义为:为:void CPerson:WriteFile(ofstream &fs) unsigned char ucStrLength;ucStrLength = strlen(m_strName) + 1;fs.write(char*)&ucStrLength, sizeof(ucStrLength);fs.write(m_strName, ucStrLength); ucStrLength = strlen(m_strID) + 1 ;fs.write(char*)&ucStrLength, sizeof(ucStrLength);
31、fs.write(m_strID, ucStrLength); fs.write(&m_cSex, sizeof(m_cSex); fs.write(char*)&m_Birthday, sizeof(m_Birthday); 写入姓名字符串的长度写入姓名字符串的长度(包括字符串结束符包括字符串结束符0)写入姓名字符串写入姓名字符串写入编号字符串的长度写入编号字符串的长度写入编号字符串写入编号字符串写入性别字符写入性别字符写入出生日期写入出生日期将将Person.cpp文件中的成员函数文件中的成员函数ReadFile()重新定义为:重新定义为: void CPerson:ReadFile(if
32、stream &fs) /从文件中读取数据从文件中读取数据unsigned char ucStrLength; fs.read(char*)&ucStrLength, sizeof(ucStrLength);delete m_strName;m_strName = new charucStrLength;fs.read(m_strName, ucStrLength);fs.read(char*)&ucStrLength, sizeof(ucStrLength);delete m_strID;m_strID = new charucStrLength;fs.read(m_strID, ucStr
33、Length);fs.read(&m_cSex, sizeof(m_cSex);fs.read(char*)&m_Birthday, sizeof(m_Birthday); 读入姓名字符串的长度读入姓名字符串的长度读入姓名字符串读入姓名字符串读入编号字符串的长度读入编号字符串的长度读入编号字符串读入编号字符串读入出生日期读入出生日期读入性别字符读入性别字符将将Student.cpp文件中的成员函数文件中的成员函数WriteFile()重新定重新定义义为:为:void CStudent:WriteFile(ofstream &fs)unsigned char ucStrLength;CPerso
34、n:WriteFile(fs);ucStrLength = strlen(m_strMajor) + 1;fs.write(char*)&ucStrLength, sizeof(ucStrLength); fs.write(m_strMajor, ucStrLength);调用调用“父类版本父类版本”的的成员函数成员函数写入专业字符串的长度写入专业字符串的长度写入专业字符串写入专业字符串将将Student.cpp文件中的成员函数文件中的成员函数ReadFile()重新定重新定义为:义为: void CStudent:ReadFile(ifstream &fs)unsigned char ucS
35、trLength; CPerson:ReadFile(fs);fs.read(char*)&ucStrLength, sizeof(ucStrLength);delete m_strMajor;m_strMajor = new charucStrLength;fs.read(m_strMajor, ucStrLength); 调用调用“父类版本父类版本”的成员函数的成员函数读入专业字符串的长度读入专业字符串的长度读入专业字符串读入专业字符串int main()CStudent Student1(李江李江, 50200900825, 0, 1991, 3, 7, 计算机科学与技术计算机科学与技术
36、);CStudent Student2(赵梅赵梅, 50200900826, 1, 1991, 6, 8, 计算机科学与技术计算机科学与技术);CStudent Student3(武峰武峰, 50200900827, 0, 1990, 5, 6, 计算机科学与技术计算机科学与技术);ofstream fout(StudentInfo.dat, ios:binary);if(fout.fail()coutOpen file failture!endl;return 1;Student1.WriteFile(fout);Student2.WriteFile(fout);Student3.Write
37、File(fout);fout.close();定义输出文件流对象定义输出文件流对象fout并通过它打开或创建文件并通过它打开或创建文件StudentInfo.dat如果文件打开如果文件打开或创建失败,或创建失败,则退出则退出将学生的信息写到输将学生的信息写到输出文件流对象出文件流对象fout中中关闭文件关闭文件ifstream fin(StudentInfo.dat, ios:binary);if(fin.fail()coutOpen file failture!endl;return 1;CStudent Student1_1, Student2_1, Student3_1;Student
38、1_1.ReadFile(fin);Student2_1.ReadFile(fin);Student3_1.ReadFile(fin);fin.close();Student1_1. DisplayStatus();Student2_1. DisplayStatus();Student3_1. DisplayStatus();return 0; 定义输入文件流对象定义输入文件流对象fin并通过它打开文件并通过它打开文件StudentInfo.dat如果文件打开失如果文件打开失败,则退出败,则退出将输入流文件对象将输入流文件对象fin中中的数据读到学生对象中的数据读到学生对象中关闭文件关闭文件输
39、出学生信息输出学生信息程序的运行结果如下:程序的运行结果如下:姓名:李江姓名:李江 编号:编号:50200900825 性别:男性别:男 出生日期:出生日期:1991,3,7 专业:计算机科学与技术专业:计算机科学与技术姓名:赵梅姓名:赵梅 编号:编号:50200900826 性别:女性别:女 出生日期:出生日期:1991,6,8 专业:计算机科学与技术专业:计算机科学与技术姓名:武峰姓名:武峰 编号:编号:50200900827 性别:男性别:男 出生日期:出生日期:1990,5,6 专业:计算机科学与技术专业:计算机科学与技术如果用记事本程序打开二进制文件如果用记事本程序打开二进制文件“S
40、tudentInfo.dat”,就会看到下图所示的内容:,就会看到下图所示的内容:48说明说明 (1)在进行二进制文件的读写之前,首先要以二)在进行二进制文件的读写之前,首先要以二进制的形式打开文件,见下面的语句。进制的形式打开文件,见下面的语句。ofstream fout(StudentInfo.dat, ios:binary);ifstream fin(StudentInfo.dat, ios:binary);(2)write是是ostream类的成员函数,其函数形式类的成员函数,其函数形式如下:如下:write(const char*, int);在进行文件操作时,函数的第在进行文件操作
41、时,函数的第1个参数表示要写个参数表示要写入文件的数据所在的入文件的数据所在的内存起始地址内存起始地址,第,第2个参数个参数是要写入文件的是要写入文件的字节数字节数。49说明说明 (3)read是是istream的成员函数,其函数形式如下:的成员函数,其函数形式如下:read(char*, int);在进行文件操作时,函数的第在进行文件操作时,函数的第1个参数表示从文个参数表示从文件中读入的数据所存放的内存空间的件中读入的数据所存放的内存空间的起始地址起始地址,函数的第函数的第2个参数表示从文件中读入的个参数表示从文件中读入的字节数字节数。50课程案例设计与编码课程案例设计与编码(课堂练习(课
42、堂练习2)51课堂练习:二进制文件的保存课堂练习:二进制文件的保存修改之前同学们为修改之前同学们为CUndergraduate类和类和CGraStudent类添加数据保存功能,修改为以二类添加数据保存功能,修改为以二进制形式保存数据和读取数据。进制形式保存数据和读取数据。并在并在main()函数中定义相应的类对象,将其数据写函数中定义相应的类对象,将其数据写入文件,并读出和显示。入文件,并读出和显示。52使用使用get()和和put()函数实现二进制文件的读写函数实现二进制文件的读写 get函数是输入流类函数是输入流类istream的成员函数,可以通的成员函数,可以通过它从文件流对象中读取数据
43、,每次读出一个字过它从文件流对象中读取数据,每次读出一个字节(字符)。节(字符)。put函数是输出流类函数是输出流类ostream的成员函数,可以通的成员函数,可以通过它向文件流对象中写入数据,每次写入一个字过它向文件流对象中写入数据,每次写入一个字节(字符)。节(字符)。下面给出一个利用下面给出一个利用get和和put函数读写二进制文件函数读写二进制文件的例子。的例子。53【例6-3】 将将09共共10个数写入二进制文件,然后个数写入二进制文件,然后从该文件中读取这些数并显示。从该文件中读取这些数并显示。#include #include using namespace std;int ma
44、in()ofstream fout(number.dat, ios:binary);if(fout.fail()coutOpen file failture!endl;return 1;定义输出文件流对象定义输出文件流对象fout并通过并通过它打开或创建文件它打开或创建文件number.dat如果文件打开或创如果文件打开或创建失败,则退出建失败,则退出54for(unsigned char c = 0; c 10; c+)fout.put(c); fout.close();ifstream fin(number.dat, ios:binary);if(fin.fail()coutOpen fi
45、le failture!endl;return 1;将将09这这10个数写到输出文件流对象个数写到输出文件流对象fout中中向文件流中写入向文件流中写入1个字节个字节关闭文件关闭文件定义输入文件流对象定义输入文件流对象fin并通过它打开文件并通过它打开文件number.dat如果文件打开失败,则退出如果文件打开失败,则退出55char ch;while(1)fin.get(ch); if(fin.eof() break;cout(int)ch ; fin.close();return 0;从输入流文件对象从输入流文件对象fin中读取数据并显示中读取数据并显示从文件流中读取从文件流中读取1个字节
46、个字节判断是否到达了文件尾判断是否到达了文件尾以整数的形式输出字符变量以整数的形式输出字符变量ch的值的值关闭文件关闭文件程序的运行结果如下:程序的运行结果如下:0 1 2 3 4 5 6 7 8 956说明说明(1)本例中使用的)本例中使用的put函数的原型是:函数的原型是:ostream& put(char)(2)本例中使用的)本例中使用的get函数的原型是:函数的原型是:istream& get(char&)(3)eof函数用于判断是否到达了文件尾。函函数用于判断是否到达了文件尾。函数返回值为真说明到达了文件尾,返回值为数返回值为真说明到达了文件尾,返回值为假说明未到达文件尾。假说明未到
47、达文件尾。C+程序的组织程序的组织57C+程序的组织方式程序的组织方式 通常,通常,C+程序可按照下面三种文件进行组程序可按照下面三种文件进行组织:织:(1)将)将类的声明类的声明作为头文件来保存,文件扩作为头文件来保存,文件扩展名为展名为.h或或.hpp。(2)将)将类的成员函数定义类的成员函数定义单独组成一个文件,单独组成一个文件,文件扩展名为文件扩展名为.cpp。(3)在主程序文件中包含)在主程序文件中包含main()函数,由主函数,由主程序文件完成对各个类对象的调用,该文程序文件完成对各个类对象的调用,该文件扩展名为件扩展名为.cpp。58“大学人员信息管理系统大学人员信息管理系统”的
48、程序组织的程序组织59说明 对应的文件 CDate类 Date.h, Date.cpp CPerson类 Person.h, Person.cpp CStudent类 Student.h, Student.cpp CEmployee类Employee.h, Employee.cppCGraStudent类 GraStudent.h, GraStudent.cpp 主程序(包含main()函数) schoolmain.cpp Date.h文件的结构文件的结构 #if !defined _DATE_H_#define _DATE_H_class CDateint m_nYear;int m_nMo
49、nth;int m_nDay;public:CDate(int nYear, int nMonth, int nDay);#endif 60通过编译预处理命令防止对CDate类的重复声明# !defined 和 #endif控制源代码要编译的部分Date.cpp文件的结构文件的结构 #include Date.h#include using namespace std;CDate:CDate(int nYear, int nMonth, int nDay)m_nYear = nYear;m_nMonth = nMonth;m_nDay = nDay; /CDate类其他成员函数的定义类其他成员
50、函数的定义61编译预处理命令编译预处理命令#if !defined、#define和和#endif 这些预处理命令的功能是当一个文件中多次(直接或间这些预处理命令的功能是当一个文件中多次(直接或间接)包含接)包含include Date.h语句时,使得语句时,使得CDate类的类的声明声明仅仅被展开一次仅仅被展开一次,而不会被重复展开,从而,而不会被重复展开,从而避免声明冲突避免声明冲突。62条件编译命令条件编译命令#if命令和命令和#endif命令属于条件编译命令,用于控制命令属于条件编译命令,用于控制源程序中被编译的部分。源程序中被编译的部分。条件编译是指当满足一定的条件时,才对程序的某条件编译是指当满足一定的条件时,才对程序的某部分进行编译。部分进行编译。#if命令和命令和#endif命令要配套使用。命令要配套使用。在上面的代码中,使用了下面的形式:在上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论