第6章基于C流类库的文件输入输出和程序的组织_new_07

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于案例的VisualC++程序设计教程文件是指存放在外部介质(如硬盘、U盘、光盘等)上的数据的集合。根据数据组织的形式,文件可分为文本文件(ASCII文件)和二进制文件。在C++中,可以利用从C语言标准库保留下来的输入/输出函数库进行文件的输入/输出操作,也可以利用C++的I/O流类库进行文件的输入/输出操作。26.1C++流类库在C++中,数据的输入/输出(如从键盘读取数据、在显示器上显示数据、从文件读取数据、将数据写入文件等)可基于流类库完成。36.1.1C++的流“流”是指数据从一个地方到另一个地方的流动抽象。例如,将数据从键盘或文件读入内存时,称为“输入流”;将数据从内存输出到显示器或文件中时,称为“输出流”。可以从流中获取数据,也可以向流中添加数据。从流中获取数据的操作称为“提取”操作,向流中添加数据的操作称为“插入”操作。C++提供了4个预定义的标准流对象:cin、cout、cerr和clog。其中,cin是istream类的对象,用于处理标准输入操作,默认指键盘输入;cout是ostream类的对象,用于处理标准输出操作,默认指显示器输出。4cin、cout和clog三个流对象带有缓冲区。缓冲区的概念是:对于输出,只有当缓冲区满后才能将缓冲区的信息进行输出;对于输入,只有输入一行结束,才开始从缓冲区读取数据。当希望缓冲区的内容立即输出时,可利用flush和endl。标准流对象常使用提取运算符“”和插入运算符“”进行输入和输出操作。56.1.2C++的流类库在C++标准库中,C++流类库使用类模板进行实现。流类模板具有层次结构,见下图。6类istream是basic_istream类模板的实例化类类ostream是basic_ostream类模板的实例化类类iftream是basic_ifstream类模板的实例化类类ofstream是basic_ofstream类模板的实例化类类fstream是basic_fstream类模板的实例化类6.2利用C++文件流类进行文本文件的读写可通过C++的文件流类ifstream、ofstream和fstream进行文本文件的读取和保存。7【例6-1】文本文件的读写在本例中,定义了3个学生对象Student1、Student2和Student3。首先进行了打开文件操作,将这些学生对象的信息以文本数据的形式写入了文本文件“StudentInfo.txt”,再通过读取该文件,将这些信息读入了另外3个学生对象Student1_1、Student2_1和Student3_1中,最后将Student1_1、Student2_1和Student3_1的信息进行了输出。8#includeiostream#includefstreamusingnamespacestd;classCDate{……};……classCPerson{protected:char*m_strName;……public:……virtualvoidWriteFile(ofstream&fs);//数据写入文件virtualvoidReadFile(ifstream&fs);//从文件中读取数据};……9人员类输出文件流类输入文件流类日期类voidCPerson::WriteFile(ofstream&fs){fsm_strName'\n'm_strID''m_cSex''m_Birthday.GetYear()''m_Birthday.GetMonth()''m_Birthday.GetDay()'';}10利用插入运算符将人员属性信息写到输出文件流fs中voidCPerson::ReadFile(ifstream&fs){intnYear,nMonth,nDay;charstrName[256],strID[12];fs.getline(strName,256);fsstrIDm_cSexnYearnMonthnDay;delete[]m_strname;m_strName=newchar[strlen(strName)+1];strcpy(m_strName,strName);delete[]m_strID;m_strID=newchar[strlen(strID)+1];strcpy(m_strID,strID);CDateBirthday(nYear,nMonth,nDay);m_Birthday=Birthday;}}11利用提取运算符从输入文件流fs读取信息从输入文件流fs中读取一行信息classCStudent:publicCPerson{staticunsignedlongm_nCount;protected:char*m_strMajor;public:……voidWriteFile(ofstream&fs);//数据写入文件voidReadFile(ifstream&fs);//从文件中读取数据};……voidCStudent::WriteFile(ofstream&fs){CPerson::WriteFile(fs);fsm_strMajorendl;}12voidCStudent::ReadFile(ifstream&fs){CPerson::ReadFile(fs);charstrMajor[256];fs.getline(strMajor,256);delete[]m_strMajor;m_strMajor=newchar[strlen(strMajor)+1];strcpy(m_strMajor,strMajor);}13unsignedlongCStudent::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();14定义输出文件流对象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;}15定义输入文件流对象fin并通过它打开文件StudentInfo.txt如果文件打开失败,则退出将输入流文件对象fin中的数据读到学生对象中关闭文件输出学生信息程序的运行结果如下:姓名:李江编号:50200900825性别:男出生日期:1991,3,7专业:计算机科学与技术姓名:赵梅编号:50200900826性别:女出生日期:1991,6,8专业:计算机科学与技术姓名:武峰编号:50200900827性别:男出生日期:1990,5,6专业:计算机科学与技术如果用记事本程序打开文本文件“StudentInfo.txt”,就会看到下图所示的内容:16本例中对文件的操作过程①打开文件StudentInfo.txt,如果该文件不存在,则创建一个文件名为StudentInfo.txt的新文件。②将学生信息以文本的形式写到文件中。③关闭此文件。④重新打开StudentInfo.txt文件。⑤将文件中的数据读到学生对象中。⑥关闭此文件。17说明(1)C++提供了3个用于文件输入/输出的文件流类,如下所示。①ifstream:输入文件流类,用于文件的输入。②ofstream:输出文件流类,用于文件的输出。③fstream:输入/输出文件流类,用于文件的输入/输出。在使用这些文件流类时,通常要在程序中包含头文件fstream。例如:#includefstream18(2)文件流类对象的定义和文件的打开①在利用文件流类进行文件操作时,首先要建立流类的对象。例如:ifstreamfin;ofstreamfout;fstreamfin_out;②可以通过流类对象的构造函数打开文件,例如:ofstreamfout(StudentInfo.txt);该语句定义了输出文件流类的对象fout,并通过其构造函数打开了用于输出的文件StudentInfo.txt。再例如:ifstreamfin(StudentInfo.txt);该语句定义了输入文件流类的对象fin,并通过其构造函数打开了用于输入的文件StudentInfo.txt。19③通过文件流对象的成员函数open()打开文件调用该函数的一般形式为:文件流对象.open(文件名,打开方式);其中,“文件名”可以包括路径(如“D:\\data\\StudentInfo.txt”),如果不指明路径,则默认为当前目录下的文件。“打开方式”决定如何打开文件,如表6-1所示。20表6-1文件的打开方式方式功能ios::app打开一个已存在的文件,以将数据添加到文件的尾部。这种方式打开的文件只能用于输出ios::ate打开一个已存文件,并将文件指针移到文件的尾部ios::binary以二进制的形式打开文件ios::in打开一个文件,进行文件输入操作ios::out打开一个文件,进行文件输出操作ios::trunc打开一个文件,如果该文件已存在,则清除文件的内容,文件的长度变为零21●如果用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);22④在进行文件打开操作时,应该判断文件打开是否成功,见下面的语句。if(fout.fail())coutOpenfilefailture!endl;fail()函数是basic_ios类模板(见图6-1)的成员函数。在这里,当返回值为true时,说明出现了文件打开错误。23(3)文本文件的读写●可通过提取运算符“”和插入运算符“”对文件流对象进行操作

1 / 53
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功