C程序设计文件流_第1页
C程序设计文件流_第2页
C程序设计文件流_第3页
C程序设计文件流_第4页
C程序设计文件流_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C程序设计文件流2四.教学过程提要文件和文件流的概念文件的打开、关闭和读写顺序文件随机文件布置作业题目和实验第1页/共45页3内容提要3.11文件流操作第2页/共45页4先看一个例子:#include<fstream.h>voidmain()//程序从这里开始运行{ ofstreamSaveFile("e:\\f1.txt"); SaveFile<<"HelloWorld!"; SaveFile.close();}第3页/共45页53.11文件流3.11.1

文件的概念和分类

文件是指存储在存储介质上的数据的集合。C++将文件看作是由一个一个字符(字节)的数据顺序组成的。按照文件中数据的存放形式可以将文件分为:ASCII文件和二进制文件。第4页/共45页6文本文件和二进制文件从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。

ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:

ASC码:00110101001101100011011100111000

↓↓↓↓

十进制码:5

6

7

8共占用4个字节。ASCII码文件可在屏幕上按字符显示。由于是按字符显示,因此能读懂文件内容。第5页/共45页7二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:0001011000101110只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C++系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。第6页/共45页83.11.2文件的读写与文件指针

“文件指针”是指表示读写文件的文件位置指示器。一个文件指针总是和一个文件相关联,当文件每一次打开时,文件指针都指向文件的开始,随着对文件进行操作,文件指针不断地在文件中移动,并一直指向最新处理的字符(字节)位置。对文件的读写操作方式有两种方式:顺序文件操作和随机文件操作。第7页/共45页9C++中与文件处理相关的类及其继承关系结构图iosistreamostreamifstreamiostreamofstreamfstream第8页/共45页10

文件操作包括打开文件、读写文件和关闭文件3个步骤。文件的打开和关闭是通过使用fstream类的成员函数open和close来实现的。fstream类的头文件是fstream.h1.打开文件打开文件应使用成员函数open(),该成员函数的函数原型为:voidopen(constunsignedchar*szName,intnMode,intnProt=filebuf::openprot);第9页/共45页11其中:szName是一个字符型指针,指定了要打开的文件名;nMode指定文件的打开方式,见表3.11-1。nProt指定了文件的保护属性,其取值为:0

Compatibilitysharemode

1

Exclusivemode—nosharing

2

Readsharingallowed

3

Writesharingallowed.第10页/共45页12表3.11-1在ios类中定义的文件打开方式文件打开方式含义ios::in以输入(读)方式打开文件ios::out以输出(写)方式打开文件ios::app打开一个文件使新的内容始终添加在文件的末尾ios::ate打开一个文件使新的内容添加在文件尾,但下一次添加时,写在当前位置处ios::trunc若文件存在,则清除文件所有内容;若文件不存在,则创建新文件ios::binary以二进制方式打开文件,缺省时以文本方式打开文件ios::nocreat打开一个已有文件,若该文件不存在,则打开失败ios::noreplace若打开的文件已经存在,则打开失败第11页/共45页13打开文件例子:fstreamf1;f1.open("d:\\vc\\test1.txt",ios::in);fstreamf2;f2.open("d:\\vc\\test2.txt",ios::out|ios::trunc);第12页/共45页14几点说明:(1)在实际使用过程中,可根据需要将以上打开文件的方式用“|”组合起来。如:

ios::in|ios::out表示以读/写方式打开文件

ios::in|ios::binary表示以二进制读方式打开文件

ios::out|ios::binary表示以二进制写方式打开文件

ios::in|ios::out|ios::binary表示以二进制读/写方式打开文件(2)如果未指明以二进制方式打开文件,则默认是以文本方式打开文件。第13页/共45页152.关闭文件

在文件操作结束时应及时调用成员函数close()来关闭文件。如:要关闭的文件对象名为myfile,则可使用如下语句关闭文件:

myfile.close();第14页/共45页163.文件的读写

在打开文件后就可以对文件进行读写操作了。从一个文件中读出数据,可以使用iostream类的get、getline、read成员函数以及运算符“>>”;而向一个文件写入数据,可以使用其put、write函数以及插入符“<<”。第15页/共45页17iostream的文件操作常用的函数函数原型说明get(char&ch)从文件中读取一个字符getline(char*pch,intcount,chardelim=’\n’)从文件中读取多个字符,读取个数由参数count决定,参数delim是读取字符时指定的结束符read(char*pch,intcount)从文件中读取多个字符,读取个数由参数count决定put(charch)向文件写入一个字符write(constchar*pch,intcount)向文件写入多个字符,字符个数由count决定第16页/共45页183.11.3顺序文件的操作

从文件的第一个字符(字节)开始顺序地处理到文件的最后一个字符(字节)。从一个文件中读出数据,可以使用get、getline、read函数以及提取符“>>”;而向一个文件写入数据,可以使用put、write函数以及插入符“<<”。第17页/共45页19【例3.11-1】向顺序文件的读写操作#include<iostream.h>#include<fstream.h> //文件操作必须的头文件voidmain(){ fstreamfile1; //定义一个fstream类的对象用于读

file1.open("Ex_DataFile.txt",ios::in); if(!file1) { cout<<"Ex_DataFile.txt不能打开!\n"; return; } fstreamfile2; //定义一个fstream类的对象用于写

file2.open("Ex_DataFileBak.txt",ios::out|ios::trunc);第18页/共45页20 if(!file2) { cout<<"Ex_DataFileBak.txt不能创建!\n"; file1.close(); return; }charch;while(file1.get(ch)) //或:file1.read(&ch,1){ cout<<ch; file2.write(&ch,1);//或:file2<<ch} file2.close();//不要忘记文件使用结束后要及时关闭

file1.close();}第19页/共45页21【例3.11-2

】有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组存到磁盘文件中.#include“fstream.h”intmain(){inta[10];ofstreamoutfile("f1.dat",ios::out); //定义文件流对象,打开磁盘文件″f1.dat″if(!outfile)//如果打开失败,outfile返回0值

{cout<<"openerror!"<<endl;return(1);}第20页/共45页22

cout<<"enter10integernumbers:"<<endl;for(inti=0;i<10;i++){cin>>a[i];outfile<<a[i]<<"

";//向磁盘文件输出数据

}outfile.close();//关闭磁盘文件″f1.dat″return0;}第21页/共45页23运行情况如下:enter10integernumbers请注意:在向磁盘文件输出一个数据后,要输出一个(或几个)空格或换行符,以作为数据间的分隔,否则以后从磁盘文件读数据时,10个整数的数字连成一片无法区分。第22页/共45页24【例3.11_3】从例3.11_2建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。#include“fstream.h”intmain(){inta[10],max,i,order;ifstreaminfile(“f1.dat”,ios::in|ios::nocreate);//定义输入文件流对象,以输入方式打开磁盘文件f1.datif(!infile){cout<<“openerror!”<<endl;return(1);}

第23页/共45页25for(i=0;i<10;i++){infile>>a[i]; //从磁盘文件读入10个整数,顺序存放在a数组中

cout<<a[i]<<"″; }//在显示器上顺序显示10个数

cout<<endl;max=a[0];order=0;第24页/共45页26for(i=1;i<10;i++)if(a[i]>max){max=a[i];//将当前最大值放在max中

order=i;//将当前最大值的元素序号放在order中

}cout<<″max=″<<max<<endl<<″order=″<<order<<endl;infile.close();return0;}第25页/共45页273.11.4随机文件操作

随机文件操作,即在文件中通过C++相关的函数移动文件指针,并指向所要处理的字符(字节)。(1)在istream类中提供了3个操作读指针的成员函数:istream&istream::seekg(longpos);istream&istream::seekg(longoff,ios::seek_dirdir);streamposistream::tellg();第26页/共45页28

其中,pos为文件指针的绝对位置;off为文件指针的相对偏移量;dir为文件指针的参照位置,其值可能为:ios::cur 文件指针的当前位置ios::beg 文件开头ios::end 文件尾

tellg()函数没有参数,它返回一个long型值,用来表示从文件开始处到当前指针位置之间的字节数。第27页/共45页29(2)在ostream类中同样提供了3个操作写指针的成员函数:ostream&istream::seekp(longpos);ostream&istream::seekp(longoff,dir);streamposistream::tellp();

这3个成员函数的含义与前面3个操作读指针成员函数的含义相同,只不过它们是用来操作写指针的。第28页/共45页30【例3.11_4】将一批数据以二进制形式存放在磁盘文件中。#include"fstream.h"structstudent{charname[20];intnum;intage;charsex;};intmain(){studentstud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'};第29页/共45页31ofstreamoutfile("e:\\stud.dat",ios::binary);if(!outfile){cout<<"openerror!"<<endl;return1;//退出程序

}for(inti=0;i<3;i++)outfile.write((char*)&stud[i],sizeof(stud[i]));outfile.close();return0;}第30页/共45页32【例3.11_5】将3.11_4以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include"fstream.h"structstudent{ charname[20]; intnum; intage; charsex;};intmain(){ studentstud[3]; inti; ifstreaminfile("stud.dat",ios::binary);第31页/共45页33 if(!infile) { cout<<"openerror!"<<endl; return(0); } for(i=0;i<3;i++) infile.read((char*)&stud[i],sizeof(stud[i])); infile.close(); for(i=0;i<3;i++) { cout<<"NO."<<i+1<<endl; cout<<"name:"<<stud[i].name<<endl; cout<<"num:"<<stud[i].num<<endl;; cout<<"age:"<<stud[i].age<<endl; cout<<"sex:"<<stud[i].sex<<endl<<endl; } return0;}第32页/共45页34问题:如果只想读出第2个学生的信息,如何修改程序?第33页/共45页35【例3.11_6】重载流输出输入运算符读写随机文件的#include<iostream.h>#include<iomanip.h>#include<fstream.h>#include<string.h>classCStudent{public: CStudent(char*name,char*id,floatscore=0); voidprint(); friendostream&operator<<(ostream&os,CStudent&stu); friendistream&operator>>(istream&is,CStudent&stu);private: charstrName[10]; //姓名

charstrID[10]; //学号

floatfScore; //成绩};第34页/共45页36续例3.11_6CStudent::CStudent(char*name,char*id,floatscore){ strncpy(strName,name,10); strncpy(strID,id,10); fScore=score;}voidCStudent::print(){ cout<<endl<<"学生信息如下:"<<endl; cout<<"姓名:"<<strName<<endl; cout<<"学号:"<<strID<<endl; cout<<"成绩:"<<fScore<<endl;}第35页/共45页37ostream&operator<<(ostream&os,CStudent&stu){ os.write(stu.strName,10); os.write(stu.strID,10); os.write((char*)&stu.fScore,4); returnos;}istream&operator>>(istream&is,CStudent&stu){ charname[10]; charid[10]; is.read(name,10); is.read(id,10); is.read((char*)&stu.fScore,4); strncpy(stu.strName,name,10); strncpy(stu.strID,id,10); returnis;}续例3.11_6第36页/共45页38voidmain(){ CStudentstu1("MaWenTao","99001",88); CStudentstu2("LiMing","99002",92); CStudentstu3("WangFang","99003",89); CStudentstu4("YangYang","99004",90); CStudentstu5("DingNing","99005",80); fstreamfile1; file1.open("student.dat",ios::out|ios::in|ios::binary); file1<<stu1<<stu2<<stu3<<stu4<<stu5; CStudent*one=newCStudent("",""); constintsize=sizeof(CStudent); file1.seekp(size*4); file1>>*one; one->print();续例3.11_6第37页/共45页39续例3.11_6 file1.seekp(size*1); file1>>*one; one->print(); file1.seekp(size*2,ios::cur); file1>>*one; one->print(); file1.close(); deleteone;}第38页/共45页40续例3.11_6运行结果如下:程序中,先将五个学生记录保存到文件中,然后移动文件指针,读取相应的记录,最后将数据输出到屏幕上。需要说明的是,由于文件流file1既可以读(ios::in)也可以写

温馨提示

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

评论

0/150

提交评论