c语言程序设计(王勇)第16章文件-海贝.ppt
第 16 章 文件,第一节 C文件概述,一、文件的概念:存储在外部介质上数据的集合,是操作系统数据管理的单位,二、使用数据文件的目的,1、数据文件的改动不引起程序的改动 程序与数据分离2、不同程序可以访问同一数据文件中的数据 数据共享3、能长期保存程序运行的中间数据或结果数据,1.按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成2.按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)3.按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放,三、文件分类,文本文件特点:存储量大、速度慢、便于对字符操作,二进制文件特点:存储量小、速度快、便于存放中间结果,49 48 48 48 48,一、文件结构体FILE,第二节 文件类型指针,1.缓冲文件系统为每个正使用的文件在内存开辟文件信息区2.文件信息用系统定义的名为FILE的结构体描述3.FILE定义在stdio.h中,二、文件类型指针的定义,格式:FILE*指针变量名;用法:FILE*fp1,*fp2;,C文件操作用库函数实现,包含在stdio.h文件使用方式:打开文件-文件读/写-关闭文件系统自动打开和关闭三个标准文件:标准输入-键盘 stdin标准输出-显示器 stdout标准出错输出-显示器 stderr打开文件fopen函数原型:FILE*fopen(char*name,char*mode),功能:按指定方式打开文件返值:正常打开,为指向文件结构体的指针;打开失败,为NULL,要打开的文件名,使用文件方式,例 文件打开与测试 FILE*fp;fp=fopen(“aa.c”,“w”);if(fp=NULL)printf(“File open error!n”);exit(0);,例 FILE*fp;fp=fopen(“c:fengyibkctest.dat”,”r”);,例 FILE*fp;char*filename=“c:fengyibkctest.dat”fp=fopen(filename,”r”);,第三节 文件的打开,二、功能,第四节 文件的关闭,一、格式,fclose(FILE*fp),关闭fp指向的文件,文件打开时返回的文件类型指针,不关闭文件可能会丢失数据,一、单字符输入与输出,第五节 文件的读写,1.fputc(c,FILE*fp),功能:把一字节代码c写入fp指向的文件中返值:正常,返回c;出错,为EOF例:fputc(A,fp),2.fgetc(FILE*fp),功能:从fp指向的文件中读取一字节代码返值:正常,返回c;出错,为EOF例:char ch;ch=fgetc(fp);,二、文件结束函数feof,格式:feof(fp),功能:判断指针fp所指向的文件是否到了文件尾返值:文件结束,返回真(非0);文件未结束,返回0,1.文本文件判断格式,while(ch=fgetc(fp)!=EOF),2.二进制文件判断格式,while(!feof(fp)c=fgetc(fp);.,#include main()FILE*in,*out;char ch,infile10,outfile10;scanf(%s,infile);scanf(%s,outfile);if(in=fopen(infile,r)=NULL)printf(Cannot open infile.n);exit(0);if(out=fopen(outfile,w)=NULL)printf(Cannot open outfile.n);exit(0);while(!feof(in)fputc(fgetc(in),out);fclose(in);fclose(out);,例 文件拷贝,第七节 格式化输入输出,格式:fscanf(文件指针,“格式控制串”,输入项表),功能:从文件指针所指的文件中按格式读取数据,存入输入项表中返值:成功,返回I/O的个数;出错或文件尾,返回EOF,一、fscanf函数,格式:fprintf(文件指针,“格式控制串”,输出项表,功能:将输入项表中的数据按格式存入文件指针所指 的文件中返值:成功,返回I/O的个数;出错,返回EOF,二、fprintf函数,fscanf(fp,“%d,%f”,/若文件中有3,4.5,则将3送入i,4.5送入t,例 fprintf(fp,“%d,%6.2f”,i,t);/将i和t按%d,%6.2f格式输出到fp所指文件,例 从键盘按格式输入数据存到磁盘文件中去,#include main()char s80,c80;int a,b;FILE*fp;if(fp=fopen(test,w)=NULL)puts(cant open file);return;fscanf(stdin,%s%d,s,第八节 字符串输入输出,格式:fgets(地址,n,文件指针),功能:从文件指针所指的文件中读取n-1个字符,存入 指定地址开始的存储单元中,返回这个地址,一、fgets函数,格式:fputs(字符串,文件指针,功能:将字符串写入文件指针所指的文件中返值:成功,返回正整数,出错,返回EOF(-1),二、fputs函数,说明:输出时字符串最后的0并不输出,也不自动加n形成的文件中字符串首尾相接,为便于阅读,可人为加入n,说明:1.若碰到换行符或文件结束标志(EOF),读入结束该函数最多能读入 n-1 个字符读入结束,系统会自动在最后加一个0,第九节 数据块输入输出函数 fread与fwrite,一、fread函数,例:若有Struct st char num8;float mk5;pers30;,格式:fread(buffer,size,count,fp);,功能:从文件中读出 count 个 size大小的数据块,存入buffer开始的空间中。,i=0;fread(,从fp所指的文件中读取1块大小为sizeof(struct st)的数据块,放入pers0开始的存储空间中,即给pers0中的各个成员赋值,二、fwrite函数,例:若有Struct st char num8;float mk5;pers30;,格式:fwrite(buffer,size,count,fp);,功能:将 从buffer开始的地址中,count 个 size大小 的数据块,写入fp所指的文件中,for(i=0;i30;i+)fwrite(,将结构体数组的所有数据写入fp所指的文件,每次写入sizeof(struct st)大小的字节,例 float f2;FILE*fp;fp=fopen(“aa.dat”,“rb”);fread(f,4,2,fp);,for(i=0;i2;i+)fread(,其作用是从数据文件中读取数据给数组f赋值,或,第十节 文件的定位,一、文件位置指针 指向当前读写位置的指针二、文件读写方式 顺序读写:位置指针按字节位置顺序移动,叫 随机读写:位置指针按需要移动到任意位置,叫三、rewind函数 格式:rewind(文件指针)功能:重置文件位置指针到文件开头 返值:无,fseek函数函数原型:int fseek(FILE*fp,long offset,int whence)功能:改变文件位置指针的位置返值:成功,返回0;失败,返回非0值,文件指针,位移量(以起始点为基点,移动的字节数)0 向后移动0 向前移动,起始点文件开始 SEEK_SET 0文件当前位置 SEEK_CUR 1文件末尾 SEEK_END 2,例 fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);,ftell函数函数原型:long ftell(FILE*fp)功能:返回位置指针当前位置(用相对文件开头的位移量表示)返值:成功,返回当前位置指针位置;失败,返回-1L,,例 磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示,例 求文件长度(ch12_101.c),#includestdio.h main()FILE*fp;char filename80;long length;gets(filename);fp=fopen(filename,rb);if(fp=NULL)printf(file not found!n);else fseek(fp,0L,SEEK_END);length=ftell(fp);printf(Length of File is%1d bytesn,length);fclose(fp);,