您好,欢迎访问三七文档
文件访问文件C文件概述–文件:存储在外部介质上数据的集合,是操作系统数据管理的单位,能永久保存数据。文件分类按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放如int型数100000010011100010000内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式文本文件特点:耗费存储量大、速度慢、便于对字符操作二进制文件特点:节约存储空间、速度快、便于存放中间结果文本文件与二进制文件–文件处理方法•缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区•非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:缓冲区指令区程序用户数据区磁盘非缓冲文件系统:文件类型指针–文件结构体FILE•缓冲文件系统为每个正使用的文件在内存开辟文件信息区•文件信息用系统定义的名为FILE的结构体描述•FILE定义在stdio.h中typedefstruct{shortlevel;/*缓冲区“满”或空的程度*/unsignedflags;/*文件状态(如只读、读/写)标记*/charfd;/*文件描述符*/unsignedcharhold;/*如果没有缓冲区,则不读取字符*/shortbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*当前的指针指向*/unsignedistemp;/*临时性的文件标记*/shorttoken;/*用于有效性检查的标记*/}FILE*fp;//定义指向结构体的指针fp–文件类型指针•指针变量说明:FILE*fp;•一般步骤:–定义文件指针变量。–文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件–文件操作(读或写)–文件关闭后,它的文件结构体被释放文件名文件使用方式文件类型指针C程序操作系统磁盘文件的打开与关闭C文件操作用库函数实现,包含在stdio.h文件使用方式:打开--读/写--关闭系统自动打开和关闭三个标准文件:•标准输入------键盘stdin•标准输出------显示器stdout•标准出错输出-----显示器stderr–打开文件fopen函数•函数原型:FILE*fopen(char*name,char*mode)功能:按指定方式打开文件返值:正常打开,为指向文件结构体的指针;打开失败,为NULL(系统定义的常量0)要打开的文件名使用文件方式例文件打开与测试FILE*fp;fp=fopen(“aa.c”,“w”);if(fp==NULL){printf(“Fileopenerror!\n”);exit(0);}例FILE*fp;fp=fopen(“c:\\fengyi\\bkc\\test.dat”,”r”);例FILE*fp;char*filename=“c:\\fengyi\\bkc\\test.dat”fp=fopen(filename,”r”);“r+/rb+”(读写)“a/ab”(追加)“w/wb”(只写)“r/rb”(只读)“w+/wb+”(读写)“a+/ab+”(读写)为输入打开一个文本/二进制文件为输出打开或建立一个文本/二进制文件为读/写打开一个文本/二进制文件为读/写建立一个文本/二进制文件为读/写打开或建立一个文本/二进制文件向文本/二进制文件尾追加数据文件使用方式含义–文件关闭fclose函数•作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针,将缓冲区数据写入文件•函数原型:intfclose(FILE*fp)功能:关闭fp指向的文件返值:正常关闭为0;出错时,非0文件打开时返回的文件类型指针磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:fclose不关闭文件可能会丢失数据/*参考源程序8-1.c*/#includestdio.hmain(){FILE*fp;longposition;fp=fopen(8-1.txt,w);position=ftell(fp);printf(Whenfileiscreated,position=%d\n,position);fprintf(fp,Sampledata);position=ftell(fp);printf(Afterwriting11characters,position=%ld\n,position);fclose(fp);}文件的读写一(8.3.1)–字符I/O:fputc与fgetc函数•fputc–函数原型:intfputc(intc,FILE*fp)–功能:把一字符c(ASCII)写入fp指向的文件中–返值:正常,返回c;出错,为EOF(-1)fgetc函数原型:intfgetc(FILE*fp)功能:从fp指向的文件中读取一字节代码返值:正常,返回读到的代码值;读到文件尾或出错,为EOF/*参考源程序8-2.c*/#includestdio.hmain(){FILE*fp;charfilename[20],ch;printf(Enterfilename:);scanf(%s,filename);if((fp=fopen(filename,r))==NULL){printf(fileopenerror.\n);exit(0);}while((ch=fgetc(fp)!=EOF)putchar(ch);fclose(fp);}文件的读写二(8.3.2)字符串I/O:fgets与fputs函数调用:char*fgets(str,n,fp)intfputs(str,fp)功能:从fp指向的文件读/写一个字符串返值:fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULLfputs正常时返回写入的最后一个字符;出错为EOF例/*参考源程序8-5.c*/fgets从fp所指文件读n-1个字符送入str指向的内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或文件尾(EOF)即结束)fputs把str指向的字符串写入fp指向的文件main(){FILEfp;charstr[81];inti,len[N];if((fp=fopen(f8-5.txt,w))==NULL){printf(fileopenerror.\n);exit(0);}printf(Input%dlinesofcharacters:\n,N);for(i=0;iN;i++){gets(str);len[i]=strlen(str);fputs(str,fp);fputs(\n,fp);}fclose(fp);printf(Outputflie:\n);if((fp=fopen(f8-5.txt,r))==NULL){printf(fileopenerror.\n);exit(0);}for(i=0;iN;i++){fgets(str,len[i]+1,fp);puts(str);fgets(fp);}fclose(fp);}文件的读写三(8.3.3)–格式化I/O:fprintf与fscanf•函数调用形式:fprintf(文件指针,格式字符串,输出表列)fscanf(文件指针,格式字符串,输出表列)功能:按格式对文件进行I/O操作返值:成功,返回I/O的个数;出错或文件尾,返回EOFprintf(“%d,%6.2f”,i,t);//将i和t按%d,%6.2f格式输出到屏幕fprintf(fp,“%d,%6.2f”,i,t);//将i和t按%d,%6.2f格式输出到fp文件scanf(“%d,%f”,&i,&t);//手工从键盘输入数据到i,t中fscanf(fp,“%d,%f”,&i,&t);//从文件fp中读入数据到变量i,t中与常用的输入输出函数对比学习:/*参考源程序8-6.c*/#includestdio.h#includestring.hmain(){FILEfp;inti,j,k,a[10];if((fp=fopen(f8-61.txt,r))==NULL){printf(fileopenerror.\n);exit(0);}for(i=0;i10;i++)fscanf(fp,%d,&a[i]fclose(fp);if((fp=fopen(f8-62.txt,w))==NULL){printf(fileopenerror.\n);exit(0);}k=0;for(i=1;i=4;i++)for(j=0;ji;i++){fprintf(fp,%d,a[k]);printf(%d,a[k]);k++;}fprintf(fp,\n);printf(\n);fclose(fp);}文件的读写四(8.3.4)–数据块I/O:fread与fwrite•调用形式:intfread(buffer,size,count,fp)intfwrite(buffer,size,count,fp)功能:读/写数据块返值:成功,返回读/写的块数;出错或文件尾,返回0说明:buffer:指向要输入/输出数据块的首地址的指针size:每个要读/写的数据块的大小(字节数)count:要读/写的数据块的个数fp:要读/写的文件指针fread与fwrite一般用于二进制文件的输入/输出/*参考源程序8-7.c*/#includestdio.h#defineN3structstudent{intnum;charname[10];intscore[3];}s[N];voidwritedata(){FILE*fp;inti;if((fp=fopen(f8-7.txt,wb))==NULL){printf(fileopenerror.\n);exit(0);}printf(InputData:\n);for(i=0;iN;i++)scanf(%d%s%d%d%d,&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);for(i=0;iN;i++)if(fwrite(&s[i],sizeof(structstudent),fp)!=1){printf(filewriteerror\n);fclose(fp);exit(0);}fclose(fp);}/*参考源程序8-7.c*/voidreaddata(){FILE*fp;inti;if((fp=fopen(f8-7.txt,rb))==NULL){printf(fileopenerror.\n);exit(0);}printf(OutputData:\n);for(i=0;iN;i++){if(fwrite(&s[i],sizeof(structstudent),fp)!=1){printf(filewriteerror\n);fclose(fp);exit(0);}printf(%-4d%-10s%4d%4d%4d\n,s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2]);}fclose(fp);}main(){writedata();readdata();}文件的定位–几个概念•文件位置指针-----指向当前读写位置的指针•读写方式–顺序读写:位置指针按字节位置顺序移动,叫~–随机读写:位置指针按需要移动到任意位置,叫~–rewind函数•
本文标题:文件访问
链接地址:https://www.777doc.com/doc-3355615 .html