CC程序设计教程课件-第13章-文件.ppt

上传人(卖家):晟晟文业 文档编号:4300885 上传时间:2022-11-27 格式:PPT 页数:45 大小:464.50KB
下载 相关 举报
CC程序设计教程课件-第13章-文件.ppt_第1页
第1页 / 共45页
CC程序设计教程课件-第13章-文件.ppt_第2页
第2页 / 共45页
CC程序设计教程课件-第13章-文件.ppt_第3页
第3页 / 共45页
CC程序设计教程课件-第13章-文件.ppt_第4页
第4页 / 共45页
CC程序设计教程课件-第13章-文件.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、12一、文本流和二进制流一、文本流和二进制流 内存中的信息会由于程序运行的结束而消失。程序运行内存中的信息会由于程序运行的结束而消失。程序运行的结果需要另外稳定的介质加以永久保存,这种可以长期保的结果需要另外稳定的介质加以永久保存,这种可以长期保留数据的存储设备称为磁盘文件。下面几种是有影响的存储留数据的存储设备称为磁盘文件。下面几种是有影响的存储方式:方式:1.ANSI C 运行库缓冲流的输出输出操作运行库缓冲流的输出输出操作 2.C 运行库低级输出输出操作运行库低级输出输出操作 3.iotream类提供的类提供的I/O操作操作 4.DOS 或或WINDOWS API 端口操作端口操作 5.

2、Microsoft Foundation 类库的文件操作类库的文件操作 3在在C/C+中流可分为两类:中流可分为两类:1)文本流文本流(text stream);1)二进制流二进制流(binary stream)文本流中的数据以字符形式出现,文本以行作为结束。文本流中的数据以字符形式出现,文本以行作为结束。图图 数据的流入流出是一个相对概念数据的流入流出是一个相对概念 流流 入入 couta 流流 入入 磁盘磁盘 内存内存 缓冲区缓冲区 内存内存 数据区数据区 键盘键盘 stdin stdout显示器显示器 stderr 打印机打印机 stdprn4二、流文件二、流文件 流文件是流文件是C运行

3、库函数中由运行库函数中由FILE结构有效处理的硬件设结构有效处理的硬件设备的逻辑描述。在这个称为标准文件备的逻辑描述。在这个称为标准文件I/O系统中系统中,定义了三个定义了三个文本流:文本流:stdin,stdout和和stderr。一般对如下前。一般对如下前3个标准设个标准设备,系统构筑了流文件的索引方式,其相应的非缓冲区的文备,系统构筑了流文件的索引方式,其相应的非缓冲区的文件代号一并罗列如下:件代号一并罗列如下:硬件设备硬件设备 预定义的流文件或流对象预定义的流文件或流对象 设备代号或句柄设备代号或句柄键键 盘(标准输入)盘(标准输入)stdin cin 0 显示器(标准输出)显示器(标

4、准输出)stdout cout 1显示器(标准错误)显示器(标准错误)stderr cerr 2串行口(标准辅助)串行口(标准辅助)stdaux 3打印机(标准打印)打印机(标准打印)stdprn clog 4 5 描述流文件的描述流文件的FILE数据结构随编译器版本的不同而相数据结构随编译器版本的不同而相异,下面的描述摘自微软异,下面的描述摘自微软VC 6.0 头文件头文件stdio.h,该结构的,该结构的具体声明如下:具体声明如下:struct _iobuf char*_ptr;/1索引数据流内容的位置指针索引数据流内容的位置指针 int _cnt;/2当前的定位标志数当前的定位标志数 c

5、har*_base;/3缓冲区基准位置缓冲区基准位置 int _flag;/4文件操作模式标记文件操作模式标记 int _file;/5文件的代号文件的代号 int _charbuf;/6字符缓冲信息字符缓冲信息 int _bufsiz;/7缓冲区大小缓冲区大小 char*_tmpfname;/8临时文件名临时文件名;typedef struct _iobuf FILE;6 对于该结构软件供应商并未逐一指明其中每一数据成员对于该结构软件供应商并未逐一指明其中每一数据成员的详细含义,标准输入输出函数的用户不要冒然直接去操作的详细含义,标准输入输出函数的用户不要冒然直接去操作其中的成员,而通过相应

6、的函数间接进行。其中的成员,而通过相应的函数间接进行。三个预定义的流文件在三个预定义的流文件在vc 6.0的的stdio.h中通过通过外部中通过通过外部说明语句和宏:说明语句和宏:extern FILE _iob;#define stdin (&_iob0)#define stdout(&_iob1)#define stderr(&_iob2)就已经在内存中构建就已经在内存中构建,因此不对这三个标准的因此不对这三个标准的I/O设备进设备进行建立和清除工作。但其它的流文件需要程序员调用相关的行建立和清除工作。但其它的流文件需要程序员调用相关的函数,进行规则的内存分配和释放工作。函数,进行规则的内

7、存分配和释放工作。7三、文件的打开函数三、文件的打开函数fopen和关闭函数和关闭函数fclose1.文件的打开函数文件的打开函数fopen 文件的打开函数文件的打开函数fopen是为要操作的磁盘文件对应的数是为要操作的磁盘文件对应的数据结构分配内存的函数,这是一个构建据结构分配内存的函数,这是一个构建FILE的数据结构变量的数据结构变量的初始化函数,系统通过调用类似的初始化函数,系统通过调用类似malloc的堆内存分配函数的堆内存分配函数完成了完成了FILE型结构变量的内存分配。下面是型结构变量的内存分配。下面是fopen函数一个函数一个简约的函数原型:简约的函数原型:FILE*fopen(

8、const char*filename,const char*mode);函数返回一个指向堆空间的函数返回一个指向堆空间的FILE*型的流文件指针。不型的流文件指针。不如确切地说该函数在堆空间诞生了一个如确切地说该函数在堆空间诞生了一个FILE型结构变量。型结构变量。8 两个两个const char*型的入口参数对上面的结构成员执行型的入口参数对上面的结构成员执行了部分初始化赋值。第一个参数了部分初始化赋值。第一个参数filename是定位磁盘文件路是定位磁盘文件路径的文件名,该文件名通常是双引号括起来的只读字符串。径的文件名,该文件名通常是双引号括起来的只读字符串。在使用含路径的文件名时,注

9、意在使用含路径的文件名时,注意“”的使用,对于硬盘的使用,对于硬盘中的文件中的文件d:mydocu_1ex.cpp 应写成应写成 “d:mydocu_1ex1.cpp”或进行如下的初始赋值或进行如下的初始赋值:const char*filename=d:mydocu_1ex1.cpp;第二个以只读字符串的形式出现的参数第二个以只读字符串的形式出现的参数mode,界定文,界定文件访问操作的模式。(其有效的取值组合和含义见下一页)件访问操作的模式。(其有效的取值组合和含义见下一页)9mode 含义含义 r 以以read only 方式打开一个文本文件,如果方式打开一个文本文件,如果 输入文件不存在

10、或未找到输入文件不存在或未找到fopen失败失败 w 以以write only方式打开一个文本文件,如果方式打开一个文本文件,如果 输出文件已存在,内容将全覆盖输出文件已存在,内容将全覆盖 a 以写和以写和append方式在文本文件末尾追加,如方式在文本文件末尾追加,如 果它不存在则先建立该文件果它不存在则先建立该文件 r+以读或写的方式打开一个必须已经存在的文以读或写的方式打开一个必须已经存在的文 本文件本文件 w+以读或写的方式打开一个空文件,如果给定的以读或写的方式打开一个空文件,如果给定的 文件名存在原来的内容将被冲洗文件名存在原来的内容将被冲洗 a+以读以读/写和追加方式打开文件,如

11、果该文件不存写和追加方式打开文件,如果该文件不存 在则先建立它在则先建立它10 rb 以只读方式打开一个以只读方式打开一个binary输入文件,如果文件输入文件,如果文件 不存在或未找到不存在或未找到fopen失败失败 wb 以只写方式打开一个二进制输出文件,如果文件以只写方式打开一个二进制输出文件,如果文件 已存在,内容将全覆盖已存在,内容将全覆盖 ab 以以append方式在方式在binary文件末尾追加,如果它文件末尾追加,如果它 不存在则先建立该文件不存在则先建立该文件 rb+以读或写的方式打开一个必须已经存在的二进制以读或写的方式打开一个必须已经存在的二进制 文件文件 wb+以读或写

12、的方式打开一个空以读或写的方式打开一个空binary文件,如果文文件,如果文 件名存在原来的内容将被销毁件名存在原来的内容将被销毁 ab+以读和追加方式打开二进制文件,如果该文件不以读和追加方式打开二进制文件,如果该文件不 存在则先建立它存在则先建立它11 指定文件的缺省操作类型取决于一个全局变量指定文件的缺省操作类型取决于一个全局变量 _fmode,vc6.0 里在头文件里在头文件stdlib.h中声明为中声明为extern int _fmode;,系统设置的默认值是文本方式即,系统设置的默认值是文本方式即:_fmode=O_TEXT=0 x4000 如果从文本方式切换为二进制模式,可以在程

13、序中令:如果从文本方式切换为二进制模式,可以在程序中令:_fmode=O_BINARY;如果在打开文件发生错误,则如果在打开文件发生错误,则fopen都返回都返回NULL即即0,其潜在的原因有:其潜在的原因有:a.以读模式打开一个并不存在的文件以读模式打开一个并不存在的文件 b.打开一个无权操作的文件(如该文件已标明只读或隐打开一个无权操作的文件(如该文件已标明只读或隐藏属性试图写追加打开)藏属性试图写追加打开)c.以追加方式对文件操作但磁盘空间不足以追加方式对文件操作但磁盘空间不足122.2.文件的关闭函数文件的关闭函数fclosefclose 函数函数fclose专用于释放由函数专用于释放

14、由函数fopen申请的堆空间,及申请的堆空间,及时完成缓冲区数据的到位。时完成缓冲区数据的到位。fclose的函数原型为:的函数原型为:int fclose(FILE int fclose(FILE*fp fp););fclose的函数原型为:的函数原型为:int fclose(FILE int fclose(FILE*fp fp););其中入口形参匹配函数其中入口形参匹配函数fopen返回的指针值,函数返回的指针值,函数fclose调用成功返回数值调用成功返回数值0,否则返回,否则返回EOF即即-1。该函数不操作预定义的流文件该函数不操作预定义的流文件stdin,stdout和和stderr

15、,它们是指向全局结构变量的指针。这样函数调用:它们是指向全局结构变量的指针。这样函数调用:fclose(fpfclose(fp););就关闭了先前由就关闭了先前由fopen函数打开的文件指针所对应的堆空函数打开的文件指针所对应的堆空间。间。13四、格式读写四、格式读写fprintf和和fscanf函数函数 1.fprintf输出函数输出函数 fprintf输出函数的一般形式为:输出函数的一般形式为:int fprintf(FILE*pTarget,const char*format,argument_list);int fprintf(流文件的目的地,格式控制串,参量列表流文件的目的地,格式控

16、制串,参量列表);fprintf函数格式控制串与函数格式控制串与printf中的相同。将中的相同。将fprintf 的的第一个形参第一个形参pTarget取为实参取为实参stdout,其调用格式相当于,其调用格式相当于printf函数。即函数。即 fprintf(stdout,格式控制串格式控制串,参量列表参量列表);相当于相当于:printf(格式控制串格式控制串,参量列表参量列表);14 在使用在使用fprintf将内存数据写到磁盘文件之前,先要指明将内存数据写到磁盘文件之前,先要指明磁盘文件的目的所在,因此通过磁盘文件的目的所在,因此通过fopen函数的写模式获得目函数的写模式获得目标地

17、址。标地址。如:如:FILE*fpWrite=fopen(writeFile,w);如此之后就可以调用的如此之后就可以调用的 fprintf 函数函数.如如:fprintf(fpWrite,format,v_list);fprintf(流文件目的地流文件目的地,格式控制串格式控制串,变量列表变量列表);152.fscanf输入函数输入函数 fscanf函数的一般形式为:函数的一般形式为:int fscanf(FILE*pSource,const char*format,address_list);int fscanf(流文件的来源处流文件的来源处,格式控制串格式控制串,变量的地址列表);变量的

18、地址列表);将将fscanf的第一个形参的第一个形参pSource实参化为实参化为stdin,其调,其调用格式相当于用格式相当于scanf函数。即:函数。即:fscanf (stdin,格式控制串格式控制串,变量地址变量地址1,变量地址变量地址2.变量地址变量地址n);相当于:相当于:scanf (格式控制串格式控制串,变量地址变量地址1,变量地址变量地址2.变量地址变量地址n);16 在调用在调用fscanf函数将磁盘源文件中的数据送到变量所占函数将磁盘源文件中的数据送到变量所占住的内存之前,先应指明待读的磁盘文件,因此借助住的内存之前,先应指明待读的磁盘文件,因此借助fopen函数的读模式

19、得到数据源流的地址函数的读模式得到数据源流的地址如:如:FILE*fpRead=fopen(readFile,r);如此之后就可以调用输入函数如此之后就可以调用输入函数fscanf。格式为:格式为:fscanf(fpRead,format,address_list);17 例例 格式转换处理一个结构变量格式转换处理一个结构变量.#include typedef struct SData int nLineset;float fAdjust;int nPoint;float fXa;float fYa;float fZa;CData;void OutputData(const char*file

20、name,const CData&d)FILE*fp=fopen(filename,w);fprintf(fp,%d,%f,%dn,d.nLineset,d.fAdjust,d.nPoint);/1 fprintf(fp,%f,%f,%fn,d.fXa,d.fYa,d.fZa);/2 fclose(fp);18void InputData(const char*filename,CData&d)FILE*fp=fopen(filename,r);fscanf(fp,%d,%f,%d,&d.nLineset,&d.fAdjust,&d.nPoint);fscanf(fp,%f,%f,%f,&d.

21、fXa,&d.fYa,&d.fZa);/2 fclose(fp);19void main(void)CData s=1,2,3,4,5,6;OutputData(c:sdata.out,s);CData d;InputData(c:sdata.out,d);OutputData(c:cdata.out,d);在文件在文件c:cdata.out中输出结果为:中输出结果为:1,2.000000,3 4.000000,5.000000,6.000000在文件在文件c:sdata.out中输出结果为:中输出结果为:1,2.000000,3 4.000000,5.000000,6.00000020五、出

22、错测试或清除函五、出错测试或清除函(feof,ferror,clearerr)1.feof函数测试文件结束标志函数测试文件结束标志 feof函数的原型为:函数的原型为:int feof(FILE*stream);该函数的调用格式常为:该函数的调用格式常为:while(!feof(stream)读写循环体读写循环体;2.ferror函数测试流中的错误函数测试流中的错误 ferror函数的原型为:函数的原型为:int ferror(FILE*stream);3.clearerr函数清除错误标志为函数清除错误标志为0 clearerr函数原型为函数原型为:void clearerr(FILE*str

23、eam);2122六、字符和字符串读写函数六、字符和字符串读写函数 1.读取单个字符的读取单个字符的fgetc函数函数 fgetc函数的原型为:函数的原型为:int fgetc(FILE*pSrcFile);FILE*型的入口形参指明读取操作的来源,型的入口形参指明读取操作的来源,实参匹配实参匹配 fopen打开的磁盘文件或打开的磁盘文件或stdin。该函数从磁盘文件的当前位置读取一个字符,该函数从磁盘文件的当前位置读取一个字符,定位源定位源磁盘文件的位置指针向后移动一个字节。如果该指针到达文磁盘文件的位置指针向后移动一个字节。如果该指针到达文件末尾,件末尾,fgetc函数返回函数返回EOF。

24、注意例程注意例程getc与函数与函数fgetc作用相同但可以作为函数和作用相同但可以作为函数和宏出现。宏出现。getchar()例程与例程与getc(stdin)一致一致,亦可以作为函数亦可以作为函数和宏出现和宏出现。23例例fgetc.cpp#include void main(void)FILE*fpGet=fopen(fgetc.cpp,r);if(fpGet=NULL)printf(fopen failedn);return;int i=0;char buffer512;while(feof(fpGet)=0&i512)buffer i+=fgetc(fpGet);bufferi=0;

25、printf(%sn,buffer);/fclose(fpGet);/程序运行的结果显示程序运行的结果显示fgetc.cpp在屏幕上在屏幕上 242.存写单个字符的存写单个字符的fputc函数函数 fputc函数的原型为:函数的原型为:int fputc(int ch,FILE*pDstFile);fputc函数的第一个形参函数的第一个形参ch正是要存写到第二个形参正是要存写到第二个形参pDstFile关联的磁盘文件中去的字符,该函数返回第一个入关联的磁盘文件中去的字符,该函数返回第一个入口形参的实参值。口形参的实参值。pDstFile匹配一个匹配一个fopen返回的流文件指针或返回的流文件指

26、针或stdout,调,调用失败返回用失败返回EOF。25例例 fputc.cpp#include void main(void)FILE*fpGet=fopen(fputc.cpp,r);if(fpGet=NULL)printf(fopen failedn);return;FILE*fpPut=fopen(fputc.xpp,w);if (fpPut=NULL)printf(fopen failedn);return;while(!feof(fpGet)/while(feof(fpGet)=0)fputc(fgetc(fpGet),fpPut);fclose(fpGet);fclose(fpP

27、ut);26 程序运行之后即将上面的程序运行之后即将上面的fputc.cpp源程序转存到源程序转存到fputc.xpp中。中。上面单个输入输出函数其返回类型是上面单个输入输出函数其返回类型是int型的数值,虽型的数值,虽然处理的是仅一个字节长的字符。然处理的是仅一个字节长的字符。因此接受这些函数的结果的变量最好定义成因此接受这些函数的结果的变量最好定义成int型变型变量即量即:int ch1=fgetc(pSrcFile);函数一般地会自动进行截断整型高位数的处理而只存函数一般地会自动进行截断整型高位数的处理而只存写低位。写低位。而能不失包容性地应付占两个字节的重要结尾信息而能不失包容性地应付

28、占两个字节的重要结尾信息EOF(-1)。273.按行读文本串按行读文本串fgets函数函数函数函数fgets的原型为:的原型为:char*fgets(char*pDstBuffer,int num,FILE*pSrcFile);FILE*型的入口形参型的入口形参pSrcFile定位数据的来源,匹配实定位数据的来源,匹配实参参stdin或或fopen函数读模式返回的流文件的指针,从中读取函数读模式返回的流文件的指针,从中读取num-1个字符到个字符到char*的入口形参的入口形参pDstBuffer标明的字符缓标明的字符缓冲区,冲区,pDstBuffer也就是该函数的返回地址。也就是该函数的返回

29、地址。如果在读取如果在读取num-1个字符之前遇到换行符个字符之前遇到换行符n则读入结则读入结束;然后添补一个束;然后添补一个0字符,以表示字符串的规则结束。字符,以表示字符串的规则结束。暗地里定位源磁盘文件的位置指针向后移动字符缓冲区暗地里定位源磁盘文件的位置指针向后移动字符缓冲区实际拥有的字节数实际拥有的字节数.pDstBuffer 匹配一个足够大的字符数组匹配一个足够大的字符数组.28例例 fgets.cpp#include void main(void)FILE*fp=fopen(fgets.cpp,r);if(fp=NULL)printf(fopen failedn);return;

30、char sBuffer128;for(int k=0;k9;k+)if(fgets(sBuffer,128,fp)!=NULL)printf(%s,sBuffer);fclose(fp);/程序运行的结果显示程序运行的结果显示 fgets.cpp在屏幕上。在屏幕上。294.按行写文本串按行写文本串fputs函数函数 函数函数fputs的原型为:的原型为:int fputs(const char*pSrcBuffer,FILE*pDstFile);文本文件的操作一般按行进行,一行一行地读一行一行文本文件的操作一般按行进行,一行一行地读一行一行地写,地写,fgets函数执行按行读的操作,函数函数

31、执行按行读的操作,函数fputs则按行写。则按行写。fputs函数将第一个形参定位的只读字符串送到送到第函数将第一个形参定位的只读字符串送到送到第二个形参指明的目的文件中的当前位置。二个形参指明的目的文件中的当前位置。如果调用成功函数返回正数,在出现错误时返回如果调用成功函数返回正数,在出现错误时返回EOF。30例例 fputs.cpp#include void main(void)FILE*fpRead=fopen(fputs.cpp,r);if(fpRead=NULL)printf(fopen r failedn);return;FILE*fpWrite=fopen(fputsw.cpp,

32、w);if(fpWrite=NULL)printf(fopen w failedn);return;31 char s 81;while(!feof(fpRead)/while(feof(fpRead)=0)if(fgets(s,81,fpRead)!=NULL)fputs(s,fpWrite);printf(%s,s);fclose(fpWrite);/程序运行显示程序运行显示fputs.cpp在屏幕上同时拷贝了一个备份在屏幕上同时拷贝了一个备份在磁盘文件在磁盘文件fputsw.cpp中中32七、无格式转换的读写函数七、无格式转换的读写函数fread和和fwrite 函数直接读写磁盘文件的二

33、进制数据,读写过程数据的函数直接读写磁盘文件的二进制数据,读写过程数据的信息未发生转换。因而空间效率和时间效率都比较高。信息未发生转换。因而空间效率和时间效率都比较高。1.函数函数fread的原型为:的原型为:size_t fread(void*pDst,size_t size,size_t items,FILE*pSrc);第一个参数第一个参数pDst定位读取数据的存放位置,匹配任意定位读取数据的存放位置,匹配任意集合类型的起始地址。集合类型的起始地址。第二个参数第二个参数size指出数据的类型大小指出数据的类型大小;size=sizeof(type)。33 第三个参数第三个参数items指

34、出数据的最大项数,常对应数组的指出数据的最大项数,常对应数组的维数,单一变量或对象常取维数,单一变量或对象常取1。第四个参数是第四个参数是FILE*型的入口形参型的入口形参pSrc,指明读入数,指明读入数据的来源。据的来源。fread返回实际读取的项数,函数从输入文件中最多读返回实际读取的项数,函数从输入文件中最多读取取items项数,每一项含有项数,每一项含有size字节,并将它们放入字节,并将它们放入pDst起起始的内存中。始的内存中。如果错误发生则所读的结果是游移的。如果错误发生则所读的结果是游移的。与与pSrc关联的关联的位置指针向后移动实际读取的字节数。位置指针向后移动实际读取的字节

35、数。342.fwrite存写函数存写函数函数函数fwrite的原型为:的原型为:size_t fwrite(const void*pSrc,size_t size,size_t items,FILE*pDst);一般地一般地fread总是读取原先由总是读取原先由frwite存写的二进制数据存写的二进制数据;第一个参数入口形参第一个参数入口形参pSrc定位所写数据的源位置,匹定位所写数据的源位置,匹配任意集合类型的起始地址。配任意集合类型的起始地址。第四个参数入口形参第四个参数入口形参 pDst指向待存写的目的地即与指向待存写的目的地即与pDst相关联的磁盘文件。相关联的磁盘文件。其余两个参数同

36、其余两个参数同fread函数。函数。35 函数函数fwrite 返回实际所存写的数据项的个数,如出现错返回实际所存写的数据项的个数,如出现错误返回值可少于误返回值可少于items。fwrite函数从函数从pSrc定位地址起尽量转送定位地址起尽量转送items个数据项个数据项到输出流文件中到输出流文件中,位置指针递增实际所写的字节数。位置指针递增实际所写的字节数。上面两个函数都存在上面两个函数都存在void*的指针用于宽泛地定位内存的指针用于宽泛地定位内存的地址,但由于其含糊性必伴随具有的地址,但由于其含糊性必伴随具有size_t 类型的具体参数类型的具体参数严格划定数据的边界,这是严格划定数据

37、的边界,这是void*型形参函数的共性。型形参函数的共性。一般地一般地fread总是读取原先由总是读取原先由frwite 存写的二进制数存写的二进制数据。据。36例例直接随机方式处理结构变量和数组直接随机方式处理结构变量和数组#include typedef struct SData int nLineset;float fAdjust;int nPoint;float fXa;float fYa;float fZa;CData;void WriteData(CData pSrc,int n,FILE*fpDst)switch(n)case 1:fwrite(pSrc,sizeof(CData

38、),1,fpDst);break;default:fwrite(pSrc,sizeof(CData),n,fpDst);inline void ReadData(CData*pDst,int n,FILE*fpSrc)fread(pDst,sizeof(CData),n,fpSrc);37void PrintData(const CData&d)printf(“%4d,%4.1f,%4d,%4.1f,%4.1f,%4.1fn”,d.nLineset,d.fAdjust,d.nPoint,d.fXa,d.fYa,d.fZa);void main(void)CData s =0,1,2,3,4,5

39、;CData d=1,2,3,4,5,6,2,3,4,5,6,7,3,4,5,6,7,8;FILE*fpWrite=fopen(c:cdata.dat,w);if(fpWrite=NULL)printf(fopen w failedn);return;WriteData(&s,1,fpWrite);WriteData(d,3,fpWrite);fclose(fpWrite);FILE*fpRead=fopen(c:cdata.dat,r);38 if(fpRead=NULL)printf(fopen r failedn);return;CData b 4;ReadData(b,3,fpRead

40、);ReadData(b+3,1,fpRead);for(int k=0;k4;k+)PrintData(bk);c:cdata.dat文件的长度为文件的长度为4*6*4=96个字节,屏幕显示个字节,屏幕显示结果为:结果为:0,1.0,2,3.0,4.0,5.0 1,2.0,3,4.0,5.0,6.0 2,3.0,4,5.0,6.0,7.0 3,4.0,5,6.0,7.0,8.039 fread和和fwrite函数因其函数因其void*入口参数而可以匹配任意入口参数而可以匹配任意类型的变量地址,而称为随机读写函数。类型的变量地址,而称为随机读写函数。但实际上数据的类型属性转移到但实际上数据的类

41、型属性转移到size_t参数上去了,这参数上去了,这个个size_t参数参数n=sizeof(type)协同函数在定位好的内存空间协同函数在定位好的内存空间中读写数据。中读写数据。因此数据类型属性的匹配依然是环环相扣不可轻易错位因此数据类型属性的匹配依然是环环相扣不可轻易错位的。即此类型的函数操作此类型的数据。随机读写应根据数的。即此类型的函数操作此类型的数据。随机读写应根据数据类型的匹配关系为:据类型的匹配关系为:void WriteData(CData*pSrc,int n,FILE*fpDst)fwrite(pSrc,sizeof(CData),n,fpDst);void ReadDat

42、a(CData*pDst,int n,FILE*fpSrc)fread(pDst,sizeof(CData),n,fpSrc);40八、文件的定位八、文件的定位1.ftell函数告知当前位置函数告知当前位置 FILE结构的声明中有一个结构的声明中有一个char*型指针成员型指针成员 _ptr即索即索引数据流内容的位置指针,该指针潜在地指向当前文件的位引数据流内容的位置指针,该指针潜在地指向当前文件的位置。置。当用户首次打开流文件进行读写操作时,操作系统把该当用户首次打开流文件进行读写操作时,操作系统把该位置指针设置在文件的开头。位置指针设置在文件的开头。但特别地以追加方式但特别地以追加方式a打

43、开文件时,位置指针定位于文打开文件时,位置指针定位于文件的结尾处。每次读写一个字符时,位置指针向前移动一个件的结尾处。每次读写一个字符时,位置指针向前移动一个字符。字符。如果从文件中读写一行文本,位置指针一般移到该行末如果从文件中读写一行文本,位置指针一般移到该行末尾或下一行开始处。尾或下一行开始处。41 ftell函数告知当前位置函数函数告知当前位置函数ftell的原型为:的原型为:long ftell(FILE*stream);函数返回的函数返回的long型值为指定文件中的当前位置相对于流型值为指定文件中的当前位置相对于流文件起始位置的字节偏移量,文件起始位置的字节偏移量,stream一般

44、匹配一般匹配fopen函数打函数打开的文件。开的文件。例例ftell.cpp#include void main(void)FILE*stream=fopen(ftell.cpp,rb);double a20;fread(a,sizeof(double),20,stream);printf(%dn,ftell(stream);/输出输出160422.fseek函数探寻文件的位置函数探寻文件的位置 函数函数fseek用于在一个打开的文件中重新定位文件的位用于在一个打开的文件中重新定位文件的位置指针,如果成功返回结果置指针,如果成功返回结果0,否则返回非否则返回非0值,在不能探寻值,在不能探寻的设

45、备上返回的结果是不定的。其函数原型为:的设备上返回的结果是不定的。其函数原型为:int fseek(FILE*stream,long offset,int origin);/fseek(文件指针,偏移量,起始位置文件指针,偏移量,起始位置);起始位置参量起始位置参量origin的取值范围必须是如下的宏名或随的取值范围必须是如下的宏名或随后具体的常数,含义为:后具体的常数,含义为:#define SEEK_CUR 1 /文件当前位置文件当前位置#define SEEK_END 2 /文件结束位置文件结束位置#define SEEK_SET 0 /文件开始位置文件开始位置43 fseek函数在函数

46、在stream形参所对应的文件中运作,将其中形参所对应的文件中运作,将其中的位置指针变动到新的位置,新的位置由的位置指针变动到新的位置,新的位置由offset算定。算定。偏移量参量偏移量参量offset指出距离指出距离origin起始位置的字节偏移起始位置的字节偏移数,正的数,正的long型实参表示以起始位置为基准前移型实参表示以起始位置为基准前移offset个字个字节作为新的位置,负的实参则后移。节作为新的位置,负的实参则后移。在流上的下一回合操作以新的位置为基准,一般可安全在流上的下一回合操作以新的位置为基准,一般可安全地用于二进制文件。地用于二进制文件。fseek函数操作文本文件的结果漂

47、移于回车换行次数的函数操作文本文件的结果漂移于回车换行次数的不确定性。不确定性。443.rewind函数反绕到文件开头位置函数反绕到文件开头位置 rewind函数原型为:函数原型为:void rewind(FILE*stream);函数函数rewind重新定位与重新定位与stream关联的位置指针到文件关联的位置指针到文件的开头。的开头。函数调用函数调用 rewind(stream);近似于:近似于:(void)fseek(stream,0L,SEEK_SET);但不象但不象 fseek,函数函数rewind清除文件结束符和清除文件结束符和stream的的出错标记。出错标记。45 九、一个简单

48、的读写存盘程序步骤九、一个简单的读写存盘程序步骤 读写存盘操作是程序设计中的重要工作,程序的读写操读写存盘操作是程序设计中的重要工作,程序的读写操作主要包含如下步骤和特点:作主要包含如下步骤和特点:1.构筑待存盘操作的数据结构,不同的数据结构对应不构筑待存盘操作的数据结构,不同的数据结构对应不同的函数同的函数;2.明晰数据的来源和走向,屏幕操作利用格式转换函数明晰数据的来源和走向,屏幕操作利用格式转换函数以进行字符处理以进行字符处理;3.格式化输出一般用于显示数据,格式化磁盘输入常严格式化输出一般用于显示数据,格式化磁盘输入常严格呼应格式化输出函数格呼应格式化输出函数;4.非格式化函数直接在内存和磁盘之间输送数据无需信非格式化函数直接在内存和磁盘之间输送数据无需信息转换息转换.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(CC程序设计教程课件-第13章-文件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|