第14章文件流和内存流.ppt
第14章 文件流和内存流,14.1 文件及文件流的基本概念文件:程序+数据+文档,外部设备的总称(aaa.c null prn con)14.1.1 输入和输出内存向外存:输出、写、存外存向内存:输入、读、取 14.1.2 文件的存储方式ASCII码:1024=49 48 50 52=0100 1001 0100 1000 0101 0000 0101 0010 二进制存储方式:1024=0000 0100 0000 0000文件流:专门用于磁盘文件I/O的流类(专门用于磁盘文件I/O的类)。,14.1.3 文件流类体系类filebuf用于管理文件的缓冲区。类fstreambase提供了I/O所需要的所有成员函数。类ifstream用于从文件中取(i)数据。类ofstream用于向文件输出(o)数据。类fstream用于文件的双向数据传递I/O)。以上类的派生(产生)方法参看305页。,14.2 文件的打开与关闭14.2.1 文件的打开C+在文件流类中提供了4个文件的成员函数:void fstreambase:open(char*,int,int=filebuf:openprot)void ifstream:open(char*,int=ios:in,int)void ofstream:open(char*,int=ios:out,int)void fstream:open(char*,int,int),说明:第一个参数是文件名,第二个参数是访问方式,第三个参数是保护方式。在所有文件流的基类ios中,可以使用下列打开模式的公有枚举成员:in 0 x01 输入 out 0 x02 输出 ate 0 x04 将指针置于文件未 app 0 x08 追加 binary 0 x80 打开二进制文件 一般情况,将几种模式组合使用。更多的成员参考306页。,例:打开一个文件result文件 ifstream infile;infile.open(“result”);等价于:infile.open(“result”,ios:in);/打开输入文件 infile.open(“result”,ios:in|ios:binary);/打开二进制输入文件,说明:对于类ifstream的对象,打开文件时默认模式in。对于类ofstream的对象,打开文件时默认模式out。C+在文件类中提供的4个文件流类中同时重载一个带缺省参数的构造函数:void fstreambase:fstreambase(char*,int,int=filebuf:openprot)void ifstream:ifstream(char*,int=ios:out,int)void ofstream:ofstream(char*,int=ios:in,int)void fstream:fstream(char*,int,int)定义对象时,同时也打开了一个文件。,4.若文件打开出错,则返回一个NULL值。因此常常用下列格式提示出错:ifstream infile;infile.open(“result”);if(!infile)cour(“cannot open this file”);exit(1);其中,exit(1)为返回编辑状态,1可省。,14.2.2 文件的关闭ifstream infile;infile.open(“result”);if(!infile)cour(“cannot open this file”);exit(1);infile.close();,14.3 文件的读写使用两个读写运算符:例14-1:模拟DOS命令,将*.cpp 再复制一份,新文件名为:*new.cpp算法:打开输入文件 打开输入/输出文件 文件复制 文件关闭,方法一:#include fstream.h#include iostream.h#include stdlib.hvoid main(int argc,char*argv)if(argc!=3)coutinput errorendl;exit(1);,ifstream infile(argv1);/定义对象并初始化,打开模式省 if(!infile)coutch)outfilech;infile.close();outfile.close();,方法二:#include fstream.h#include iostream.h#include stdlib.hvoid main(int argc,char*argv)if(argc!=3)cerrinput error;exit(1);fstream infile,outfile;/先定义文件类对象 infile.open(argv1,ios:in);/不是构造函数,不能省略模式 outfile.open(argv2,ios:out);,if(!infile|!outfile)cerrCont open file endl;exit(1);char ch;while(infile.get(ch)outfile.put(ch);infile.close();outfile.close();,14.5 文件读写函数14.5.1 二进制文件读写函数istream说明:第一个参数为内容,第二个参数为读写的字节数。,例14-2:用二进制读写函数完成文本文件的复制#include#include stdlib.hvoid main(int argc,char*argv)if(argc!=3)cerrinput error;exit(1);fstream infile,outfile;infile.open(argv1,ios:in|ios:binary);outfile.open(argv2,ios:out|ios:binary);,if(!infile|!outfile)/文件打开有错,对象为0 cerrCont open file endl;exit(1);char ch1024;do infile.read(ch,1024);if(infile.eof()/文件结束为真 int n=infile.gcount();/把最后不够1024字节时的字节取出 outfile.write(ch,n);break;,else outfile.write(ch,1024);while(1);infile.close();outfile.close();,例14-3:用二进制读写函数完成数据文件的写(p318)生成10个数,进行排序,然后保存到文件中#include#include“stdlib.h”#include#include#include“ex14_5.h”/见P314中,void main()int savedate(int*,int,char*);int*iarray;iarray=Generatedatas(10);/生成10个随机数 if(!iarray)/不成功时iarray为0 cerr”memory allocation error,press any key to exit n”;getch();/按任意键返回 exit(1);,sortdata(iarry,10);/排序,函数子程序见p315 savedata(iarray,10,”datas1.dat”);/保存排序后的数据 releasememory(iarray);/用后释放 int savedata(int*ip,int n,char*fname)ofstream of;of.open(fname,ios:out|ios:binary);if(!of)cerr”file creating eror!”endl;return 0;of.write(char*)ip,n*sizeof(int);/对数据指针强制转换成字符指针,按字节数写入对象建立的文件 of.close();return 1;,int*Generatedate(int n)/因为返回的是指针,因此函数也是指针函数int*ip;ip=new intn;if(!ip)return 0;randomize();/要使用头文件stdlib.hfor(i=0;in;i+)ipi=rand()%1000;return ip;void ReleasMemory(int*ip)delete ip;,例14-4:用二进制读写函数完成数据文件的读#include#include void main()int loaddata(int*,char*);void showdata(int*,int);int iarray10,i;i=loaddata(iarray,”data1.dat”);/从文件中读数据到数组 showdata(iarray,i);/将读出的数据显示,int loaddata(int*ip,char*fname);ifstream ifs;int i=0;ifs.open(fname,ios:in+ios:binary);if(!ifs)cerr”file opening error!”endl;return 0;,while(1)ifs.read((char*)ip,sizeof(int);/每次读两个字节且强制转换 if(ifs.eof()break;ip+;i+;/统计数据个数return i;,void showdata(int*ip,int n)for(int i=0;in;i+)coutipi”“;coutendl;说明:以上函数使用了数组和指针之间的相互传递。,14.5.2 文本文件读写例14-5:编写,将任意程序中的标识符取出显示的函数程序#include#include“ctype.h”void Getident(ifstream infile,char*s)/对象和存放标识符指针 char ch;infilech;/读第一个字符 if(isalpha(ch)|ch=_)/用头文件“ctype.h”do/isalpta(ch)是字母为真,*s+=ch;infile.get(ch);/取下一个字符 while(isalnum(ch)|ch=_);/字母、数字或下划线循环*s=0;/置串结束标记 infile.putback(ch);/返还最后一次多读的字符,例14-6:计算10以内的自然数的平方根,且保存到文件data.txt中#include#include fstream.h#include stdlib.h#include math.hvoid main()ofstream outfile;outfile.open(data.txt,ios:out);if(!outfile)coutCont open file endl;exit(1);,for(int k=1;k11;k+)outfilektsqrt(k)endl;coutktsqrt(k)endl;outfile.close();,例14-7:将以上数据文件取出显示方法1:#include#include fstream.h#include stdlib.h#include math.hvoid main()int a;float b;ifstream infile;,infile.open(data.txt,ios:in);if(!infile)coutab;coutatbendl;infile.close();,方法2:#include#include fstream.h#include stdlib.hvoid main()int a;float b;int k=0;ifstream infile;infile.open(data.txt,ios:in);if(!infile)coutCont open file endl;exit(1);,while(1)infileab;coutatbendl;k+;if(infile.eof()break;infile.close();,方法3:#include#include fstream.h#include stdlib.hvoid main()int a;float b;int k=0;ifstream infile;infile.open(data.txt,ios:in);,if(!infile)coutab;coutatbendl;k+;infile.close();,例14-8:建立一个数据文件,有姓名,三门课程成绩,利用该文件求每人平均成绩将以上数据文件取出求平均且显示#include#include fstream.h#include stdlib.hvoid main()int a,b,c;char name10;ifstream infile;infile.open(num.txt,ios:in);,if(!infile)coutnameabc;coutnametatbt(a+b+c)/3endl;if(infile.eof()break;infile.close();,例14-9:将从键盘上输入的10个数据存入文件#include fstream.hvoid main()int k,n;ofstream outfile;outfile.open(data.txt,ios:out);if(!outfile)cerr n;outfilen”;outfile.close();,总结:二进制读写方式适用于什么情况?ASCII码读写方式适用于什么情况?管理文件包括:复制、连接、修改、替换、删除、提取、插入、查找、统计、显示、加密、粘贴板、回收站、保存、输入、记忆输入。,