资源描述
,西安电子科技大学软件学院,-School of,Computer S,oftware,Xidian University,China,#,外存上的数据存储在文件中,在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。,如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。,外存上的数据存储在文件中,在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。,如果如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。,控制器,运算器,内存储器,外存储器,输入设备,输出设备,数据的流动,与流向,控制信号的,流动与流向,C,语言中的文件概述,文件与文件名,文件,是指存放在外部存储介质上的数据集合,为了标识一个文件,每个文件都必须有一个文件名,其一般结构为:,主文件名,.,扩展名,文件命名规则需遵循操作系统的约定,文件分类,根据文件的内容,可分为程序文件和数据文件,程序文件又可分为源文件、目标文件和可执行文件。,根据文件的组织形式,可分为顺序存取文件和随机存取文件,根据文件的存储形式,可分为文本文件和二进制文件。,C,语言中的文件概述,读文件与写文件,所谓读文件是指,将外存文件中的数据读取到计算机内存的操作。,所谓写文件是指,从计算机内存向外存文件写入数据的操作。,构成文件的基本单元与流式文件,C,语言,将文件看作是由一个一个的字符(,ASCII,码文件)或字节(二进制文件)组成的。将这种文件称为流式文件。,文件指针,文件指针类型,文件指针类型格式:,FILE*,说明:所有对文件的操作都需要使用文件指针类型,文件变量,定义格式:,FILE*fp;,说明:要访问某个文件,一定需要首先定义文件指针类型的变量,并将该变量与对应文件关联起来,此后才能进行文件操作,文件的基本操作,文件打开操作,文件关闭操作,读取文件中的数据操作,在文件中写入数据的操作,文件结束检测操作,文件错误检测操作,文件缓冲区与流刷新操作,文件指针定位操作,文件指针位置查询操作,文件指针重定位操作,文件操作的标准库函数,fopen,fclose fcloseall,feof,fgetc /fputc,fgets /fputs,fscanf /fprintf,fread /fwrite,rewind,fseek,ferror,fflush,文件的打开和关闭,对文件进行操作前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。,语言规定了标准输入输出函数库,用,fopen(),函数打开一个文件,用,fclose(),函数关闭一个文件。,进行文件操作前,首先应定义一个文件指针变量,格式为:,FILE*fp;,其中,变量名,fp,可换成其他名字,若文件打开操作是成功的,此后在程序中,,fp,就代表外存文件,fact.c,打开文件和关闭文件,用函数,fopen(),打开指定文件,例如,以只读方式打开文件,d:tc20fact.c:,fp=fopen(,d:tc20fact.c,r,);,fp=fopen(,文件名,打开文件方式,),;,用函数,fclose(),关闭前面打开的文件,fclose(fp);,打开文件的方式,fp=fopen(,文件名,打开文件方式,),;,文件打开方式,意义,”,r,”,只读打开一个文本文件,只允许读数据,”,w,”,只写打开或建立一个文本文件,只允许写数据,”,a,”,追加打开一个文本文件,并在文件末尾写数据,”,rb,”,只读打开一个二进制文件,只允许读数据,”,wb,”,只写打开或建立一个二进制文件,只允许写数据,”,ab,”,追加打开一个二进制文件,并在文件末尾写数据,”,r+,”,读写打开一个文本文件,允许读和写,”,w+,”,读写打开或建立一个文本文件,允许读写,”,a+,”,读写打开一个文本文件,允许读,或在文件末追加数据,读取文件中的字符,-,fgetc,函数,fgetc(),从指定的文件读取并返回一个字符,例如,编写程序读取文件“,d:tc20fact.c”,中的数据并显示在屏幕上。,ch=fgetc(fp),;,步骤:,1),定义文件指针变量和其他变量;,2),以读方式打开文件;,3),文件是否结束:是,转,5);,否则,转,4),;,4),从文件中读取一个字符并输出,转,3,);,5),关闭文件。,读取文件中的字符,例如,编写程序读取文件“,d:tc20fact.c”,中的数据并显示在屏幕上。,#include,int main(),FILE*fp;char ch;,fp=fopen(d:tc20fact.c,r);,if(,fp=NULL,),printf(open file error!n);,exit(0);,while(,!feof(fp),),ch=fgetc(fp);,printf(%c,ch);,fclose(fp);,return 0;,创建文件:以写方式打开,再用写入函数,例如,以写入方式打开,(,创建,),文件,d:testchar.dat:,fp=fopen(,d:testchar.dat,w,);,函数,fputc(),将一个字符写入文件,可以忽略返回值,例如:,fputc(ch,fp),;,函数原型:,int fputc(int ch,FILE*stream);,The return value is the character,unless there is an error,in which case,the return value is EOF.,创建元素为字符的文件,步骤:,1),定义文件指针变量和其他变量;,2),以写入方式打开文件;,3),写入是否结束:是,转,5);,否则,转,4),;,4),将一个字符常量或变量的值写入文件,转,3,);,5),关闭文件。,例如,编写程序,将从键盘输入前,20,个字符写入文件“,d:testchar.dat”,向文件写入字符数据,-,fputc,例如,编写程序,将从键盘输入前,20,个字符写入文件“,d:testchar.dat”,#include,#include,int main(),FILE*fp;char i=0,ch;,fp=fopen(d:testchar.dat,w);,if(,fp=NULL,),printf(open file error!n);,exit(0);,while(,i 20,),ch=getchar();,fputc(ch,fp);,i+;,fclose(fp);,system(,pause,);,return 0;,复制文件,:,从一个文件读出,向另一个文件写入,编写程序,将“,d:tc20swap.c”,复制一份存放在“,D:testswapbak.c”,。,步骤:,1),定义两个文件指针变量和其他变量;,2),以读方式打开文件,swap.c,;以写方式打开文件,swapbak.c,;,3),文件,swap.c,是否结束:是,转,5);,否则,转,4),;,4),从,swap.c,中读取一个字符写入文件,swapbak.c,,转,3,);,5),关闭文件。,#include,int main(),FILE*in,*out;char ch;,in=fopen(d:tc20swap.c,r);,out=fopen(d:testswapbak.c,w);,if(,in=NULL|out=NULL,),printf(open file error!n);,exit(0);,while(,!feof(in),),ch=fgetc(in);,fputc(ch,out);,fclose(in);,fclose(out);,return 0;,串的读写:,fgets/fputs,函数,fgets(),从指定文件中读取一个字符串,常用格式:,fgets(,字符数组名,n,文件指针,),;,n,是一个正整数,表示从文件中读出的字符串不超过,n-1,个字符。在读入的最后一个字符后加上串结束标志,0,。,在读出,n-1,个字符之前,若遇到了换行符或,EOF,,则结束。,fgets,函数的返回值是字符数组的首地址。,原型:,char*fgets(char*str,int num,FILE*stream);,The function fgets()reads up to,num,-1 characters from the given file,stream,and dumps them into,str,.fgets()will stop when it reaches the end of a line,in which case,str,will be terminated with a newline.If fgets()reaches,num,-1 characters or encounters the EOF,str,will be null-terminated.fgets()returns,str,on success,and NULL on an error.,串的读写:,fgets/fputs,函数,fputs(),用于将指定字符串写入文件,常用格式:,fputs(,字符串,文件指针,),;,其中的字符串可以是字符串常量,也可以是字符数组名,或字符指针变量。,原型:,int fputs(const char*str,FILE*stream);,The fputs()function writes an array of characters pointed to by,str,to the given output,stream,.The return value is non-negative on success,and EOF on failure.,fgets,读取文件内容,编写程序,将“,test_time.c”,的内容用,fgets,读取出来并显示在屏幕上。,#include,#include,#define SIZE 1024,int main(),FILE*in;char str,SIZE+1,;,in=fopen(test_time.c,r);,if(,in=NULL,),printf(open file error!n);,exit(0);,while(,!feof(in),),fgets(str,SIZE,in);,puts(str);,fclose(in);,system(,pause,);,return 0;,格式化读写数据:,fprintf/fscanf,函数,fprintf(),以指定格式向文件写入数据,fscanf,(,文件指针,格式串,输入表列,),;,fprintf,(,文件指针,格式串,输出表列,),;,函数,fscanf(),以指定格式从文件中读取数据,除了增加文件指针参数,函数,“,fprintf,(),、,fscanf,(),”,与,“,printf,(),、,scanf,(),”,在用法相同,fprintf,的返回值为写入的字符个数,,fscanf,的返回值为读取的数据个数,可作为是否正确完成操作的依据。,写入整数或浮点数时,数之间应有间隔,#include,int main(),FILE*in,*out;int a,b;,in=fopen(c.in,r);,out=fopen(csqr.dat,w);,if(,in=NULL|out=NULL,),printf(open file error!n);,exit(0);,复制文件:格式化读写,编写程序,将“,d:tc20c.in”,文件中的每个数据取出后,求平方后写入“,D:testcsqr.dat”,。,while(,!feof(in),),fscanf(in,%d,b=a*a;,printf(%8d,b);,fprintf(out,%8d,b);,fclose(in);,fclose(out);return 0;,if(fscanf(in,%d,&a)!=1),break;,数据块读写:,fread/fwrite,读写整块数据,可用来读写一组数据,如一个数组,一个结构变量的值等。,buffer,是一个指针,在,fread,函数中,它表示存放输入数据的首地址。在,fwrite,函数中,它表示存放输出数据的首地址,size,表示数据块的大小(字节数),count,表示要读写的数据块数,fp,表示文件指针,读数据块函数调用的一般形式为:,fread(buffer,size,count,fp);,写数据块函数调用的一般形式为:,fwrite(buffer,size,count,fp);,数据块读写:,fread/fwrite,读数据块函数调用的一般形式为:,fread(buffer,size,count,fp);,buffer,是一个指针,在,fread,函数中,它表示存放输入数据的首地址。在,fwrite,函数中,它表示存放输出数据的首地址,size,表示数据块的大小(字节数),count,表示要读写的数据块数,fp,表示文件指针,The function fread()reads,count,number of objects(where each object is,size,bytes)and places them into the array pointed to by buffer.The data comes from the given input,stream,fp.The return value of the function is the number of things read.You can use,feof,()or,ferror,()to figure out if an error occurs.,写数据块函数调用的一般形式为:,fwrite(buffer,size,count,fp);,定义结构体,描述学生信息的结构:,typedef struct,char Sno10;,char Sname20;,int Grade,;,STUDENT;,定义结构体数组,存储学生信息:,STUDENT studinfo100;,复制文件:数据块读写,编写程序,将“,stud.dat”,文件中每个学生的数据取出后显示,再写入“,studbak.dat”,。,int main(),FILE*in,*out;int i;,in=fopen(stud.dat,rb);,out=fopen(studbak.dat,wb);,if(,in=NULL|out=NULL,),printf(open file error!n);,exit(0);,复制文件:数据块读写,编写程序,将“,stud.dat”,文件中每个学生的数据取出后显示,再写入“,studbak.dat”,。,i=0;,while(!feof(in),fread(studinfo+i,sizeof(STUDENT),1,in);,printf(%s%s%dn,studinfoi.Sno,studinfoi.Sname,studinfoi.Grade);,i+;,fwrite(studinfo,sizeof(STUDENT),i,out);,fclose(in);,fclose(out);return 0;,if(fread(studinfo+i,sizeof(STUDENT),1,in)!=1),break;,移动文件指针:,rewind/fseek,rewind,的功能是把文件指针移到文件首,fseek,用来移动文件指针到指定的位置,用法:,rewind(,文件指针,);,移动文件指针:,fseek,fseek,用来移动文件指针到指定的位置,“,文件指针”指向被操作的文件。,“位移量”表示指针要移动的字节数,,要求位移量是,long,型数据,以便在文件长度大于,64KB,时不会出错。当用常量表示位移量时,要求加后缀“,L”,。例如,,fseek(fp,10L,SEEK_SET),“,起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首(,SEEK_SET/0,),当前位置(,SEEK_CUR/1,)和文件尾(,SEEK_END/2,)。,用法:,fseek(,文件指针,位移量,起始点,);,fseek,适用于二进制文件,用于文本文件时,应该令所有数据(整数、浮点数和字符串)以相同的宽度写入。例如,,fprintf(out,%8d,b);,文件操作的标准库函数,fopen fclose fcloseall,feof,fgetc /fputc,fgets /fputs,fscanf /fprintf,fread /fwrite,rewind fseek,ferror,fflush,缓冲文件系统,文件指针在缓冲区移动,fflush,用于清除缓冲区内容,文件以写方式打开时将缓冲区内容写入外存文件,外存文件,输出文件缓冲区,输入文件缓冲区,程序数据区,a,实验一,基本要求,1.,用随机函数产生,1000,个整数,保存在文件(,intfile.dat,)中,然后将文件中的数据读取出来显示。,(,1,)用,fprintf,函数写入数据,要注意整数之间需要有分隔符号,所有数据写入后关闭文件,;,(,2,)重新打开文件,用,fscanf,函数逐个读取并显示数据;,(,3,)用,fseek,函数对文件指针进行定位,仅读取需要的数据。例如,分别将文件指针定位到第,5,个整数、第,10,个整数,读取这两个整数并显示;分别将文件指针定位到倒数第,5,个整数、倒数第,10,个整数,读取这两个整数并显示,。,这里要求打开的是二进制文件,用,fscanf,函数写入数据时应采用相同的场宽。,基本要求,2.,建立一个由,n,名学生信息组成的文件(,studinfo.dat,),其中,每个学生都有学号、姓名、性别和三门课程的成绩。,(,1,)用结构体类型描述学生的基本信息,其中:学号和姓名用字符串表示,其长度定义参照本校的情况,课程名自行定义,成绩采用百分制;,(,2,)学生信息由键盘输入,先存入结构体变量;,(,3,)用,fwrite,函数将结构体变量的值写入文件,studinfo.dat,;,(,4,)用,fread,函数从文件,studinfo.dat,中读取数据并按一定格式显示在屏幕上(例如,每行显示一个学生信息,各项信息之间要有一定的间隔,所有学生的所有信息对齐显示等),随机数,随机函数,rand(),#include,RAND_MAX,在,stdlib.h,中定义,不大于双字节整数的最大值,32767,产生,0,RAND_MAX,之间的随机数,magic=rand();,产生,0,b-1,之间的随机数,magic=rand()%b;,产生,a,a+b-1,之间的随机数,magic=rand()%b+a;,随机数,随机函数,srand,为函数,rand(),设置随机数种子来实现对函数,rand,所产生的伪随机数的“随机化”,通过键入随机数种子,产生,0,100,之间的随机数,scanf(%u,srand,(seed);,magic=,rand,()%100+1;,使用计算机读取其时钟值并把该值自动设置为随机数种子,产生,0,100,之间的随机数,函数,time(),返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子,#include ,srand,(,(unsigned),time(NULL);,magic=,rand,()%100+1;,
展开阅读全文