




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7讲基于C++流类库的
文件输入输出1本讲主要内容1.基于C++流类库的文本文件的读写2.基于C++流类库的二进制文件的读写3.C++程序的结构2【例6-1】文本文件的读写在本例中,定义了3个学生对象Student1、Student2和Student3。首先进行了翻开文件操作,将这些学生对象的信息以文本数据的形式写入了文本文件“StudentInfo.txt〞,再通过读取该文件,将这些信息读入了另外3个学生对象Student1_1、Student2_1和Student3_1中,最后将Student1_1、Student2_1和Student3_1的信息进行了输出。3#include<iostream>#include<fstream>usingnamespacestd;classCDate { intm_nYear; intm_nMonth; intm_nDay;public: CDate(intnYear,intnMonth,intnDay); intGetYear(); intGetMonth(); intGetDay();};……日期类4classCPerson {protected: char*m_strName; char*m_strID; charm_cSex; CDatem_Birthday; public: CPerson(char*strName="",char*strID="",charcSex='0',intnYear=0,intnMonth=0,intnDay=0); ~CPerson(); voidSetName(char*strName); voidGetName(char*strName)const;…… virtualvoidPrintInfo()=0;
virtualvoidWriteFile(ofstream&fs)=0;//数据写入文件
virtualvoidReadFile(ifstream&fs)=0;//从文件中读取数据};……人员类输出文件流类输入文件流类5classCStudent:publicCPerson { staticunsignedlongm_nCount; private: char*m_strMajor; public: CStudent(char*strName="",char*strID="",charcSex='0',intnYear=0,intnMonth=0,intnDay=0,char*strMajor=""); ~CStudent(); voidSetMajor(char*strMajor); voidGetMajor(char*strMajor)const; voidCopy(CStudent&Student); staticunsignedlongGetCount(); virtualvoidPrintInfo();
voidWriteFile(ofstream&fs);//数据写入文件
voidReadFile(ifstream&fs);//从文件中读取数据};……6voidCStudent::WriteFile(ofstream&fs){
fs<<m_strName<<'\n'<<m_strID<<''<<m_cSex<<''<<m_Birthday.GetYear()
<<''<<m_Birthday.GetMonth()<<''<<m_Birthday.GetDay()<<''
<<m_strMajor<<endl;}利用插入运算符将学生属性信息写到输出文件流fs中7从输入文件流fs中读取1行信息;getline是fs对象的成员函数voidCStudent::ReadFile(ifstream&fs){ intnYear,nMonth,nDay; charstrName[256],strID[12],strMajor[256];
fs.getline(strName,256);
fs>>strID>>m_cSex>>nYear>>nMonth>>nDay;
fs.getline(strMajor,256);
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); delete[]m_strMajor; m_strMajor=newchar[strlen(strMajor)+1]; strcpy(m_strMajor,strMajor); CDateBirthday(nYear,nMonth,nDay); m_Birthday=Birthday;}利用提取运算符从输入文件流fs中读取信息8unsignedlongCStudent::m_nCount=0; intmain(){ CStudentStudent1("李江","50202300825",'0',1991,3,7,"计算机科学与技术"); CStudentStudent2("赵梅","50202300826",'1',1991,6,8,"计算机科学与技术"); CStudentStudent3("武峰","50202300827",'0',1990,5,6,"计算机科学与技术"); ofstreamfout("StudentInfo.txt"); if(fout.fail()) { cout<<"Openfilefailture!"<<endl; return1; } Student1.WriteFile(fout); Student2.WriteFile(fout); Student3.WriteFile(fout); fout.close();
定义输出文件流对象fout并通过它翻开或创立文件StudentInfo.txt如果文件翻开或创立失败,那么退出将学生的信息写到输出文件流对象fout中关闭文件9
ifstreamfin("StudentInfo.txt");
if(fin.fail()) { cout<<"Openfilefailture!"<<endl; return1; } CStudentStudent1_1,Student2_1,Student3_1;
Student1_1.ReadFile(fin); Student2_1.ReadFile(fin); Student3_1.ReadFile(fin);
fin.close(); Student1_1.PrintInfo(); Student2_1.PrintInfo(); Student3_1.PrintInfo(); return0;}定义输入文件流对象fin并通过它翻开文件StudentInfo.txt如果文件翻开失败,那么退出将输入流文件对象fin中的数据读到学生对象中关闭文件输出学生信息10程序的运行结果如下:姓名:李江编号:50202300825性别:男出生日期:1991,3,7专业:计算机科学与技术姓名:赵梅编号:50202300826性别:女出生日期:1991,6,8专业:计算机科学与技术姓名:武峰编号:50202300827性别:男出生日期:1990,5,6专业:计算机科学与技术如果用记事本程序翻开文本文件“StudentInfo.txt〞,就会看到以下图所示的内容:11本例中对文件的操作过程①翻开文件StudentInfo.txt,如果该文件不存在,那么创立一个文件名为StudentInfo.txt的新文件。②将学生数据以文本的形式写到文件中。③关闭此文件。④重新翻开StudentInfo.txt文件。⑤将文件中的数据读到学生对象中。⑥关闭此文件。12说明〔1〕C++提供了3个用于文件输入输出的文件流类,如下所示。 ①ifstream:输入文件流类,用于文件的输入。 ②ofstream:输出文件流类,用于文件的输出。 ③fstream:输入/输出文件流类,用于文件的输入/输出。 在使用这些文件流类时,通常要在程序中包含头文件fstream。例如:#include<fstream>13〔2〕文件流类对象的定义和文件的翻开①在利用文件流类进行文件操作时,首先要建立流类的对象。例如: ifstreamfin; ofstreamfout; fstreamfin_out;②可以通过流类对象的构造函数翻开文件,例如: ofstreamfout("StudentInfo.txt");该语句定义了输出文件流类的对象fout,并通过其构造函数翻开文件StudentInfo.txt。再例如: ifstreamfin("StudentInfo.txt");该语句定义了输入文件流类的对象fin,并通过其构造函数打开文件StudentInfo.txt。14③可以通过文件流对象的成员函数open翻开文件调用该函数的一般形式为: 文件流对象.open(文件名,翻开方式);其中,“文件名〞可以包括路径〔如 “D:\\data\\StudentInfo.txt〞〕,如果不指明路径,那么默认为当前目录下的文件。“翻开方式〞决定如何翻开文件,如表6-1所示。15表6-1文件的翻开方式方式功能ios::app打开一个输出文件,以将数据添加到文件的尾部ios::ate打开一个已存文件,并将文件指针移到文件的尾部ios::binary以二进制的形式打开文件,默认值为文本文件形式ios::in打开一个文件,进行文件输入操作ios::out打开一个文件,进行文件输出操作ios::trunc打开一个文件,如果该文件已存在,则清除文件的内容,文件的长度变为零。16●如果用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)●如果文件翻开时需要多种翻开方式的组合,那么应使用“|〞〔位或操作符〕将几种翻开方式组合在一起。例如,可采用以下方式翻开一个能够进行输入和输出的二进制文件。 fstreamfin_out; fin_out.open("test.dat",ios::in|ios::out|ios::binary);●当指定“ios::out〞方式后,隐含为“ios::trunc〞方式,即如果翻开的输出文件已存在,那么自动清空该文件的内容。17④在进行文件翻开操作时,应该判断文件翻开是否成功,见下面的语句。 if(fout.fail()) cout<<"Openfilefailture!"<<endl; fail函数是ios_base类(ios_base类是fstream、ifstream、ofstream的祖先类)的成员函数。在这里,当返回值为true时,说明出现了文件翻开错误。18〔3〕文本文件的读写●getline函数 本例中,从文件流读取数据时用到了getline函数,见下面的语句。 fs.getline(strName,256); 函数getline(char*_Str,int_Count)的含义是:从文件流中读取_Count个字节到_Str所指的内存中,如果还没有读取_Count个字节就遇到回车符'\n',那么读取过程中止。19〔4〕文件的关闭在对文件的读写操作完成后,应关闭文件。通过关闭操作,文件流对象与相应的物理文件进行了脱离。如果不进行文件的关闭,那么可能造成文件数据的丧失。关闭文件可使用流类的成员函数close完成,例如:fout.close();fin.close();206.2二进制文件的读写当进行二进制文件的读写时,在翻开文件时要使用“ios::binary〞来指定以二进制的形式进行文件流的操作。对二进制文件的读写可使用get、put函数或read、write函数。这些函数也可以用于文本文件的读写。下面首先通过read、write函数改写例6-1,实现二进制文件的读写,然后介绍get、put函数的使用方法。216.2.1利用write和read函数实现二进制文件的读写【例6-2】二进制文件的读写。 本例将学生信息写入二进制文件,然后再从二进制文件中读出学生信息并进行显示。本例在例6-1的代码根底上进行修改,主要代码如下所示。22……voidCStudent::WriteFile(ofstream&fs){ unsignedcharucStrLength; 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));
fs.write(m_strID,ucStrLength);
fs.write(&m_cSex,sizeof(m_cSex)); fs.write((char*)&m_Birthday,sizeof(m_Birthday));
ucStrLength=strlen(m_strMajor)+1;
fs.write((char*)&ucStrLength,sizeof(ucStrLength));
fs.write(m_strMajor,ucStrLength);
}写入姓名字符串的长度(包括字符串结束符\0)写入姓名字符串写入编号字符串的长度写入编号字符串写入性别字符写入出生日期写入专业字符串的长度写入专业字符串写二进制文件23voidCStudent::ReadFile(ifstream&fs){ unsignedcharucStrLength;
fs.read((char*)&ucStrLength,sizeof(ucStrLength));
delete[]m_strName; m_strName=newchar[ucStrLength];
fs.read(m_strName,ucStrLength);
fs.read((char*)&ucStrLength,sizeof(ucStrLength));
delete[]m_strID; m_strID=newchar[ucStrLength];
fs.read(m_strID,ucStrLength);
fs.read(&m_cSex,sizeof(m_cSex)); fs.read((char*)&m_Birthday,sizeof(m_Birthday)); fs.read((char*)&ucStrLength,sizeof(ucStrLength));
delete[]m_strMajor; m_strMajor=newchar[ucStrLength];
fs.read(m_strMajor,ucStrLength);
}读入姓名字符串的长度读入姓名字符串读入编号字符串的长度读入编号字符串读入出生日期读入专业字符串的长度读入专业字符串读入性别字符读二进制文件24unsignedlongCStudent::m_nCount=0;intmain(){ CStudentStudent1("李江","50202300825",'0',1991,3,7,"计算机科学与技术"); CStudentStudent2("赵梅","50202300826",'1',1991,6,8,"计算机科学与技术"); CStudentStudent3("武峰","50202300827",'0',1990,5,6,"计算机科学与技术"); ofstreamfout("StudentInfo.dat",ios::binary); if(fout.fail()) { cout<<"Openfilefailture!"<<endl; return1; } Student1.WriteFile(fout); Student2.WriteFile(fout); Student3.WriteFile(fout); fout.close();定义输出文件流对象fout并通过它翻开或创立文件StudentInfo.dat如果文件翻开或创立失败,那么退出将学生的信息写到输出文件流对象fout中关闭文件25
ifstreamfin("StudentInfo.dat",ios::binary);
if(fin.fail()) { cout<<"Openfilefailture!"<<endl; return1; } CStudentStudent1_1,Student2_1,Student3_1;
Student1_1.ReadFile(fin); Student2_1.ReadFile(fin); Student3_1.ReadFile(fin);
fin.close(); Student1_1.PrintInfo(); Student2_1.PrintInfo(); Student3_1.PrintInfo(); return0;}定义输入文件流对象fin并通过它翻开文件StudentInfo.dat如果文件翻开失败,那么退出将输入流文件对象fin中的数据读到学生对象中关闭文件输出学生信息26程序的运行结果如下:姓名:李江编号:50202300825性别:男出生日期:1991,3,7专业:计算机科学与技术姓名:赵梅编号:50202300826性别:女出生日期:1991,6,8专业:计算机科学与技术姓名:武峰编号:50202300827性别:男出生日期:1990,5,6专业:计算机科学与技术如果用记事本程序翻开二进制文件“StudentInfo.dat〞,就会看到以下图所示的内容:27说明〔1〕在进行二进制文件的读写之前,首先要以二进制的形式翻开文件,见下面的语句。ofstreamfout("StudentInfo.dat",ios::binary);ifstreamfin("StudentInfo.dat",ios::binary);〔2〕write是ostream类的成员函数,其函数形式如下:ostream&write(constchar*,int); 在进行文件操作时,函数的第1个参数表示要写入文件的数据所在的内存起始地址,第2个参数是要写入文件的字节数。〔3〕read是istream的成员函数,其函数形式如下: istream&read(char*,int); 在进行文件操作时,函数的第1个参数表示从文件中读入的数据所存放的内存空间的起始地址,函数的第2个参数表示从文件中读入的字节数。286.2.2利用get和put函数实现二进制文件的读写get函数是输入流类istream的成员函数,可以通过它从文件流对象中读取数据,每次读出一个字节〔字符〕。put函数是输出流类ostream的成员函数,可以通过它向文件流对象中写入数据,每次写入一个字节〔字符〕。下面给出一个利用get和put函数读写二进制文件的例子。29【例6-3】将0~9共10个数写入二进制文件,然后从该文件中读取这些数并显示。#include<iostream>#include<fstream>usingnamespacestd;intmain(){
ofstreamfout("number.dat",ios::binary);
if(fout.fail()) { cout<<"Openfilefailture!"<<endl; return1; }定义输出文件流对象fout并通过它翻开或创立文件number.dat如果文件翻开或创立失败,那么退出30 for(unsignedcharc=0;c<10;c++) fout.put(c); fout.close(); ifstreamfin("number.dat",ios::binary); if(fin.fail()) { cout<<"Openfilefailture!"<<endl; return1; }将0~9这10个数写到输出文件流对象fout中向文件流中写入1个字节关闭文件定义输入文件流对象fin并通过它翻开文件number.dat如果文件翻开失败,那么退出31 charch; while(1) { fin.get(ch); if(fin.eof()) break; cout<<(int)ch<<''; } fin.close(); return0;}从输入流文件对象fin中读取数据并显示从文件流中读取1个字节判断是否到达了文件尾以整数的形式输出字符变量ch的值关闭文件程序的运行结果如下:012345678932说明〔1〕本例中使用的put函数的原型是: ostream&put(char)〔2〕本例中使用的get函数的原型是: istream&get(char&)〔3〕eof函数用于判断是否到达了文件尾。函数返回值为真说明到达了文件尾,返回值为假说明未到达文件尾。33
C++程序的结构
34通过多个文件组织程序一般一个较大的C++程序可按照下面三类文件来存放:将类的声明作为头文件来存放,文件扩展名为.h或.hpp;将类成员函数的定义单独组成一个文件,可单独编译,文件扩展名为.cpp;将类的使用放在一个文件里,其中包含一个main()函数,文件扩展名为.cpp。35图C++程序的结构classA{…..};#include"A.h"intA::fun(){…..}#include"A.h"main(){Aob;cout<<ob.fun();}类界面类实现36C++程序设计思路通过面向对象程序设计方法,程序编制显得相对自然和简捷。首先定义各个类,然后定义假设干个对象,然后调用其成员函数,由成员函数来完成程序员所规定的操作〔即让对象表现自己〕。37对【例6-1】〔文本文件的读写〕进行改写,按照头文件和cpp文件分开的方式进行组织。38【例6-1】〔文本文件的读写〕中的类日期类人员类学生类39文本文件的读写Date.h //类声明Date.cpp //类成员函数定义Person.h //类声明Person.cpp //类成员函数定义Student.h //类声明Student.cpp //类成员函数定义UMIS1_Text_File.cpp//主函数程序的根本结构40#ifndef_DATE_H_#define_DATE_H_classCDate//日期类{ intm_nYear; intm_nMonth; intm_nDay;public: CDate(intnYear,intnMonth,intnDay); intGetYear(); intGetMonth(); intGetDay();};#endif通过预编译指示防止对Date类的重复声明Date.h#ifndef和#endif控制源代码要编译的局部41#include"Date.h"CDate::CDate(intnYear,intnMonth,intnDay){ m_nYear=nYear; m_nMonth=nMonth; m_nDay=nDay;}intCDate::GetYear(){ returnm_nYear;}intCDate::GetMonth(){ returnm_nMonth;}intCDate::GetDay(){ returnm_nDay;}Date.cpp42#ifndef_PERSON_H_#define_PERSON_H_#include"Date.h"#include<fstream>usingnamespacestd;classCPerson//人员类{protected: char*m_strName;//姓名 char*m_strID;//编号 charm_cSex;//性别:'0':男'1':女 CDatem_Birthday;//出生日期public: CPerson(char*strName="",char*strID="",charcSex='0',intnYear=0,intnMonth=0,intnDay=0); ~CPerson(); …… voidSetBirthday(CDateBirthday); CDateGetBirthday()const; virtualvoidPrintInfo()=0; virtualvoidWriteFile(ofstream&fs)=0;//数据写入文件 virtualvoidReadFile(ifstream&fs)=0;//从文件中读取数据};#endifPerson.h43#include"Person.h"CPerson::CPerson(char*strName,char*strID,charcSex,intnYear,intnMonth,intnDay):m_Birthday(nYear,nMonth,nDay){ m_strName=newchar[strlen(strName)+1]; strcpy(m_strName,strName); m_strID=newchar[strlen(strID)+1]; strcpy(m_strID,strID); m_cSex=cSex;}CPerson::~CPerson(){ delete[]m_strName; deletem_strID;}……CDateCPerson::GetBirthday()const{ returnm_Birthday;}Person.cpp44#ifndef_STUDENT_H#define_STUDENT_H#include"Person.h"classCStudent:publicCPerson//学生类:从人员类公有派生{ staticunsignedlongm_nCount;//学生人数private: char*m_strMajor;//专业public: CStudent(cha
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理工作环境评估知识试题及答案
- 医学教授面试题及答案
- 深入育婴师考试试题及答案
- 广东计算机试题及答案
- 消防安全试题及答案学生
- 上海中级电工试题及答案
- 三体黑暗森林试题及答案
- 2025年公共营养师考生心理准备与考试应对策略试题及答案
- 教师创新能力培养中小学资格笔试试题及答案
- 2024-2025学年三年级人教版下学期数学期中考试卷(基础卷)(含解析)
- 2022年广州白云广附实验学校入学数学真卷(二)
- 浅谈初中数学单元整体教学的实践 论文
- 历史时期的地貌变迁优秀课件
- 论文写作100问智慧树知到答案章节测试2023年中国石油大学(华东)
- 心血管内科五年发展规划
- 高考地理一轮复习课件+湖泊的水文特征
- 换热器设计说明书
- 医院科研课题申报伦理审查申请及审批表
- 解读财务报表-三张主表课件
- 弹塑性力学(浙江大学课件)
- 工程管理工程项目管理模式和发展趋势课件
评论
0/150
提交评论