第6章基于C流类库的文件输入输出和程序的组织_new_07.ppt_第1页
第6章基于C流类库的文件输入输出和程序的组织_new_07.ppt_第2页
第6章基于C流类库的文件输入输出和程序的组织_new_07.ppt_第3页
第6章基于C流类库的文件输入输出和程序的组织_new_07.ppt_第4页
第6章基于C流类库的文件输入输出和程序的组织_new_07.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

第6章基于C+流类库的文件输入/输出及C+程序的组织,文件是指存放在外部介质(如硬盘、U盘、光盘等)上的数据的集合。根据数据组织的形式,文件可分为文本文件(ASCII文件)和二进制文件。在C+中,可以利用从C语言标准库保留下来的输入/输出函数库进行文件的输入/输出操作,也可以利用C+的I/O流类库进行文件的输入/输出操作。,6.1C+流类库,在C+中,数据的输入/输出(如从键盘读取数据、在显示器上显示数据、从文件读取数据、将数据写入文件等)可基于流类库完成。,6.1.1C+的流,“流”是指数据从一个地方到另一个地方的流动抽象。例如,将数据从键盘或文件读入内存时,称为“输入流”;将数据从内存输出到显示器或文件中时,称为“输出流”。可以从流中获取数据,也可以向流中添加数据。从流中获取数据的操作称为“提取”操作,向流中添加数据的操作称为“插入”操作。C+提供了4个预定义的标准流对象:cin、cout、cerr和clog。其中,cin是istream类的对象,用于处理标准输入操作,默认指键盘输入;cout是ostream类的对象,用于处理标准输出操作,默认指显示器输出。,cin、cout和clog三个流对象带有缓冲区。缓冲区的概念是:对于输出,只有当缓冲区满后才能将缓冲区的信息进行输出;对于输入,只有输入一行结束,才开始从缓冲区读取数据。当希望缓冲区的内容立即输出时,可利用flush和endl。标准流对象常使用提取运算符“”和插入运算符“”进行输入和输出操作。,6.1.2C+的流类库,在C+标准库中,C+流类库使用类模板进行实现。流类模板具有层次结构,见下图。,类istream是basic_istream类模板的实例化类,类ostream是basic_ostream类模板的实例化类,类iftream是basic_ifstream类模板的实例化类,类ofstream是basic_ofstream类模板的实例化类,类fstream是basic_fstream类模板的实例化类,6.2利用C+文件流类进行文本文件的读写,可通过C+的文件流类ifstream、ofstream和fstream进行文本文件的读取和保存。,【例6-1】文本文件的读写,在本例中,定义了3个学生对象Student1、Student2和Student3。首先进行了打开文件操作,将这些学生对象的信息以文本数据的形式写入了文本文件“StudentInfo.txt”,再通过读取该文件,将这些信息读入了另外3个学生对象Student1_1、Student2_1和Student3_1中,最后将Student1_1、Student2_1和Student3_1的信息进行了输出。,#include#includeusingnamespacestd;classCDate;classCPersonprotected:char*m_strName;public:virtualvoidWriteFile(ofstream,人员类,输出文件流类,输入文件流类,日期类,voidCPerson:WriteFile(ofstream,利用插入运算符将人员属性信息写到输出文件流fs中,voidCPerson:ReadFile(ifstream,利用提取运算符从输入文件流fs读取信息,从输入文件流fs中读取一行信息,classCStudent:publicCPersonstaticunsignedlongm_nCount;protected:char*m_strMajor;public:voidWriteFile(ofstream,voidCStudent:ReadFile(ifstream,unsignedlongCStudent:m_nCount=0;intmain()CStudentStudent1(李江,50200900825,0,1991,3,7,计算机科学与技术);CStudentStudent2(赵梅,50200900826,1,1991,6,8,计算机科学与技术);CStudentStudent3(武峰,50200900827,0,1990,5,6,计算机科学与技术);ofstreamfout(StudentInfo.txt);if(fout.fail()coutOpenfilefailture!endl;return1;Student1.WriteFile(fout);Student2.WriteFile(fout);Student3.WriteFile(fout);fout.close();,定义输出文件流对象fout并通过它打开或创建文件StudentInfo.txt,如果文件打开或创建失败,则退出,将学生的信息写到输出文件流对象fout中,关闭文件,ifstreamfin(StudentInfo.txt);if(fin.fail()coutOpenfilefailture!endl;return1;CStudentStudent1_1,Student2_1,Student3_1;Student1_1.ReadFile(fin);Student2_1.ReadFile(fin);Student3_1.ReadFile(fin);fin.close();Student1_1.DisplayInfo();coutendl;Student2_1.DisplayInfo();coutendl;Student3_1.DisplayInfo();coutendl;return0;,定义输入文件流对象fin并通过它打开文件StudentInfo.txt,如果文件打开失败,则退出,将输入流文件对象fin中的数据读到学生对象中,关闭文件,输出学生信息,程序的运行结果如下:姓名:李江编号:50200900825性别:男出生日期:1991,3,7专业:计算机科学与技术姓名:赵梅编号:50200900826性别:女出生日期:1991,6,8专业:计算机科学与技术姓名:武峰编号:50200900827性别:男出生日期:1990,5,6专业:计算机科学与技术如果用记事本程序打开文本文件“StudentInfo.txt”,就会看到下图所示的内容:,本例中对文件的操作过程,打开文件StudentInfo.txt,如果该文件不存在,则创建一个文件名为StudentInfo.txt的新文件。将学生信息以文本的形式写到文件中。关闭此文件。重新打开StudentInfo.txt文件。将文件中的数据读到学生对象中。关闭此文件。,说明,(1)C+提供了3个用于文件输入/输出的文件流类,如下所示。ifstream:输入文件流类,用于文件的输入。ofstream:输出文件流类,用于文件的输出。fstream:输入/输出文件流类,用于文件的输入/输出。在使用这些文件流类时,通常要在程序中包含头文件fstream。例如:#include,(2)文件流类对象的定义和文件的打开,在利用文件流类进行文件操作时,首先要建立流类的对象。例如:ifstreamfin;ofstreamfout;fstreamfin_out;可以通过流类对象的构造函数打开文件,例如:ofstreamfout(StudentInfo.txt);该语句定义了输出文件流类的对象fout,并通过其构造函数打开了用于输出的文件StudentInfo.txt。再例如:ifstreamfin(StudentInfo.txt);该语句定义了输入文件流类的对象fin,并通过其构造函数打开了用于输入的文件StudentInfo.txt。,通过文件流对象的成员函数open()打开文件,调用该函数的一般形式为:文件流对象.open(文件名,打开方式);其中,“文件名”可以包括路径(如“D:dataStudentInfo.txt”),如果不指明路径,则默认为当前目录下的文件。“打开方式”决定如何打开文件,如表6-1所示。,表6-1文件的打开方式,如果用ifstream类来定义一个流对象,则隐含为输入流,不必再添加ios:in说明;如果用ofstream类来定义一个流对象,则隐含为输出流,不必再添加ios:out说明。例如:ifstreamin;in.open(test.dat);/等同于in.open(test.dat,ios:in);ofstreamout;out.open(test.dat);/等同于out.open(test.dat,ios:out)当指定“ios:out”方式后,隐含为“ios:trunc”方式,即如果打开的输出文件已存在,则自动清空该文件的内容。如果文件打开时需要多种打开方式的组合,则应使用“|”(位或操作符)将几种打开方式组合在一起。例如,可采用以下方式打开一个能够进行输入和输出的二进制文件。fstreamfin_out;fin_out.open(test.dat,ios:in|ios:out|ios:binary);,在进行文件打开操作时,应该判断文件打开是否成功,见下面的语句。if(fout.fail()coutOpenfilefailture!”和插入运算符“”对文件流对象进行操作,实现文件的读和写。getline()函数fs.getline(strName,256);/从文件中读取姓名信息函数getline()是basic_istream的成员函数,其函数声明是:basic_istream其含义是:从文件流中读取_Count个字节到_Str所指的内存中,如果还没有读取_Count个字节就遇到回车符n,则读取过程中止。,(4)文件的关闭,在对文件的读写操作完成后,应关闭文件。通过关闭操作,文件流对象与相应的物理文件进行了脱离。如果不进行文件的关闭,则可能造成文件数据的丢失。关闭文件可使用流类的成员函数close()完成,例如:fout.close();fin.close();,6.3利用C+文件流类进行二进制文件的读写,当进行二进制文件的读写时,在打开文件时要使用“ios:binary”来指定以二进制的形式进行文件流的操作。对二进制文件的读写可使用C+流类的get()、put()成员函数或read()、write()成员函数。这些函数也可以用于文本文件的读写。下面首先通过read()、write()函数改写例6-1,实现二进制文件的读写,然后介绍get()、put()函数的使用方法。,6.3.1利用write()和read()函数实现二进制文件的读写,【例6-2】二进制文件的读写。本例将学生信息写入二进制文件,然后再从二进制文件中读出学生信息并进行显示。本例在例6-1的代码基础上进行修改,主要代码如下所示。,voidCPerson:WriteFile(ofstream,/写入编号字符串fs.write(m_strID,ucStrLength);/写入性别字符fs.write(,voidCPerson:ReadFile(ifstream,voidCStudent:WriteFile(ofstream,voidCStudent:ReadFile(ifstream,unsignedlongCStudent:m_nCount=0;intmain()CStudentStudent1(李江,50200900825,0,1991,3,7,计算机科学与技术);CStudentStudent2(赵梅,50200900826,1,1991,6,8,计算机科学与技术);CStudentStudent3(武峰,50200900827,0,1990,5,6,计算机科学与技术);ofstreamfout(StudentInfo.dat,ios:binary);if(fout.fail()coutOpenfilefailture!endl;return1;Student1.WriteFile(fout);Student2.WriteFile(fout);Student3.WriteFile(fout);fout.close();,定义输出文件流对象fout并通过它打开或创建二进制文件StudentInfo.dat,如果文件打开或创建失败,则退出,将学生的信息写到输出文件流对象fout中,关闭文件,ifstreamfin(StudentInfo.dat,ios:binary);if(fin.fail()coutOpenfilefailture!endl;return1;CStudentStudent1_1,Student2_1,Student3_1;Student1_1.ReadFile(fin);Student2_1.ReadFile(fin);Student3_1.ReadFile(fin);fin.close();Student1_1.DisplayInfo();coutendl;Student2_1.DisplayInfo();coutendl;Student3_1.DisplayInfo();coutendl;return0;,定义输入文件流对象fin并通过它打开二进制文件StudentInfo.dat,如果文件打开失败,则退出,将输入流文件对象fin中的数据读到学生对象中,关闭文件,输出学生信息,程序的运行结果如下:姓名:李江编号:50200900825性别:男出生日期:1991,3,7专业:计算机科学与技术姓名:赵梅编号:50200900826性别:女出生日期:1991,6,8专业:计算机科学与技术姓名:武峰编号:50200900827性别:男出生日期:1990,5,6专业:计算机科学与技术如果用记事本程序打开二进制文件“StudentInfo.dat”,就会看到下图所示的内容:,说明,(1)在进行二进制文件的读写之前,首先要以二进制的形式打开文件,见下面的语句。ofstreamfout(StudentInfo.dat,ios:binary);ifstreamfin(StudentInfo.dat,ios:binary);(2)write()是ostream类的成员函数,其函数原型如下:ostream在进行文件操作时,函数的第1个参数表示从文件中读入的数据所存放的内存空间的起始地址,函数的第2个参数表示从文件中读入的字节数。,6.3.2利用get()和put()函数实现二进制文件的读写,get()函数是输入流类istream的成员函数,可以通过它从文件流对象中读取数据,每次读出一个字节(字符)。put()函数是输出流类ostream的成员函数,可以通过它向文件流对象中写入数据,每次写入一个字节(字符)。下面给出一个利用get()和put()函数读写二进制文件的例子。,【例6-3】将09共10个数写入二进制文件,然后从该文件中读取这些数并显示。,#include#includeusingnamespacestd;intmain()ofstreamfout(number.dat,ios:binary);if(fout.fail()coutOpenfilefailture!endl;return1;,定义输出文件流对象fout并通过它打开或创建二进制文件number.dat,如果文件打开或创建失败,则退出,for(unsignedcharc=0;c10;c+)fout.put(c);fout.close();ifstreamfin(number.dat,ios:binary);if(fin.fail()coutOpenfilefailture!endl;return1;,将09这10个数写到输出文件流对象fout中,向文件流中写入1个字节,关闭文件,定义输入文件流对象fin并通过它打开文件number.dat,如果文件打开失败,则退出,charch;while(1)fin.get(ch);if(fin.eof()break;cout(int)ch;fin.close();return0;,从输入流文件对象fin中读取数据并显示,从文件流中读取1个字节,判断是否到达了文件尾,以整数的形式输出字符变量ch的值,关闭文件,程序的运行结果如下:0123456789,说明,(1)本例中使用的put()函数的原型是:ostreamintm_nMonth;intm_nDay;public:CDate(intnYear,intnMonth,intnDay);#endif,通过编译预处理命令防止对CDate类的重复声明,#!defined和#endif控制源代码要编译的部分,Date.cpp文件的结构,#includeDate.h#includeusingnamespacestd;CDate:CDate(intnYear,intnMonth,intnDay)m_nYear=nYear;m_nMonth=nMonth;m_nDay=nDay;/CDate类其他成员函数的定义,编译预处理命令#if!defined、#define和#endif,这些预处理命令的功能是当一个文件中多次(直接或间接)包含includeDate.h语句时,使得CDate类的声明仅仅被展开一次,而不会被重复展开,从而避免声明冲突。,条件编译命令,#if命令和#endif命令属于条件编译命令,用于控制源程序中被编译的部分。条件编译是指当满足一定的条件时,才对程序的某部分进行编译。#if命令和#endif命令要配套使用。在上面的代码中,使用了下面的形式:#if!defined#define#endif其中,的命名规则通常是将头文件名大写,前后加下划线,并将文件名中的“.”也变成下划线。,说明,代码中,“#if!defined_DATE_H_”的含义是:如果没有定义_DATE_H_标识符,则进行下面程序部分的编译,直到遇到#e

温馨提示

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

评论

0/150

提交评论