7.2.6文件操作 - 文件操作-专题辅导课件_第1页
7.2.6文件操作 - 文件操作-专题辅导课件_第2页
7.2.6文件操作 - 文件操作-专题辅导课件_第3页
7.2.6文件操作 - 文件操作-专题辅导课件_第4页
7.2.6文件操作 - 文件操作-专题辅导课件_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C程序设计专题辅导课

文件操作内容提要:什么是文件如何操作文件文件应用例子一、什么是文件为什么要文件数据如何长久保存?数组、结构、链表等是内存数据存储的方式,不能长久保存;程序计算结果如何长久保存?大规模输入数据如何保存?如何输入程序?不同程序之间如何交换数据?文件:保存在外存储器上的一组数据的有序集合文件如何组织C语言中的文件是数据流操作系统:负责文件的整体管理和数据的存取应用程序:负责文件数据的解释与使用字节

........字节字节字节字节字节文件的两种数据形式:

ASCII码(文本文件textstream)字符流

二进制码(二进制文件binarystream)二进制文件是直接把内存数据以二进制形式保存。例如,整数1234文本文件保存:49505152(4个字符)二进制文件保存:04D2(1234的二进制数)

缓冲文件系统向磁盘输出数据:数据缓冲区,装满缓冲区后(或文件关闭)磁盘文件。从磁盘读入数据:先一次性从磁盘文件将一批数据输入到缓冲区,然后再从缓冲区逐个读入数据到变量。

数据

……缓冲器512字节……文件由操作系统自动完成程序控制文件名内存单元内存单元用什么标识二、如何操作文件所有文件操作都通过函数调用方式实现使用登记:通知操作系统(fopen/fclose)数据读写:具体读写操作(四对常用的读写函数)访问定位:默认方式是顺序读写要跳跃读写需要应用程序自己定位(fseek)状态判断:判别当前文件读写的状态打开文件:操作系统为相应文件建立缓冲区信息表FILE*fopen(文件名,打开方式)关闭文件:释放缓冲区资源fclose(文件指针)FILE:结构类型用typedef

定义,stdio.htypedef

struct{short level; /*缓冲区使用量*/unsigned flags; /*文件状态标志*/char fd; /*文件描述符*/short bsize; /*缓冲区大小*/unsignedchar *buffer; /*文件缓冲区的首地址*/unsignedchar *curp; /*指向文件缓冲区的工作指针*/unsignedchar hold; /*其他信息*/unsigned istemp;short token;}FILE;使用登记文件打开方式fp=fopen("f.txt","r")文件打开方式参数表不同打开方式,文件读写起始位置不同:文件头:r/r+,w/w+文件尾:a/a+文件读写函数字符读写函数:文本文件

字符,字符

文本文件charfgetc(FILE*fp)

int

fputc(charc,FILE*fp);字符串读写函数:文本文件

字符串(字符数组),字符串

文本文件char*fgets(char*string,intn,FILE*fp);int

fputs(char*string,FILE*fo);格式化读写函数:文本文件

不同类型变量,不同类型变量

文本文件int

fscanf(FILE*fp,char*format,…);int

fprintf(FILE*fp,char*format,…);二进制读写函数:二进制文件

内存(变量),内存(变量)-->二进制文件int

fread(char*buffer,intsize,intcount,FILE*fp);int

fwrite(char*buffer,intsize,intcount,FILE*fp)文件定位的函数:fseek(FILE*fp,longoff,intstart);rewind(FILE*fp);ftell(FILE*fp);状态检测:检测文件结尾函数feof(FILE*fp)检测文件读写出错函数ferror(FILE*fp);清除末尾标志和出错标志函数clearerr(FILE*fp);三、文件应用例子例1已知函数原型voidprint(FILE*input,char*output);

其中:input为输入流,output为输出文件名问:将标准输入流(stdin)内容传到文件”temp.txt”的语句是?print(stdin,“temp.txt”);例子2:将a.txt文件中的小写字母转大写,存入b.txt中voidmain(){charc;FILE*f1,*f2;if((f1=fopen("a.txt","r"))==NULL){printf("Can'topena.txt");exit(0);}if((f2=fopen("b.txt","w"))==NULL){printf("Can'topenb.txt");exit(0);}

while((c=fgetc(f1))!=EOF) if(c>='a'&&c<='z')fputc(c+'A'-'a',f2);elsefputc(c,f2);fclose(f1);fclose(f2);}

while(!feof(f1)){c=fgetc(f1);if(c>='a'&&c<='z')fputc(c+'A'-'a',f2);elsefputc(c,f2);}例子3:分析程序输出a.txt:one?two?1234?output?b.txt:one?two?1204?input?程序输出为____voidmain(){intcount;charch1,ch2;FILE*f1,*f2; if((f1=fopen("a.txt","r"))==NULL){printf("Can'topena.txt");exit(0);}if((f2=fopen("b.txt","r"))==NULL){printf("Can'topenb.txt");exit(0);} count=0; while(!feof(f1)||!feof(f2)){ch1=fgetc(f1); ch2=fgetc(f2); if(ch1!=ch2){printf("%c#%c#",ch1,ch2);

printf("%d#",count); break; } if(ch1=='?')count++; } fclose(f1); fclose(f2);}3#0#2#文本文件in.txt包含下列三行数据,ThisisademohelloworldCisfun在下面这个命令行程序find.c中,在运行“find–nis”后程序的输出为()voidmain(int

argc,char*argv[]){ charline[1000];int

lineno=0;FILE*fp; if((fp=fopen("in.txt","r"))==NULL){

printf("File

in.txtOpenError\n");exit(1); }

if(argc==2){ while(fgets(line,1000,fp)!=NULL) if(strstr(line,argv[1])!=NULL)printf("%s",line);}elseif(argc==3&&strcmp(argv[1],"-n")==0) while(fgets(line,1000,fp)!=NULL){

lineno++; if(strstr(line,argv[2])!=NULL)

printf("%d:%s",lineno,line);} }elseprintf("Usage:find[-n]pattern\n");}例子4:分析程序输出1:Thisisademo3:Cisfun例子5:命令行参数方式比较两个文本文件是否完全相同:progfile1file2。main(int

argc,char*argv[]){FILE*fp1,*fp2;charc1,c2;if(argc!=

(1)

){printf("Usage:progfile1file2\n");exit(0);}if((fp1=fopen(argv[1],"r"))==NULL||

(2)

){

printf("Cannotopenfiles\n");exit(0);}c1=fgetc(fp1);c2=fgetc(fp2);while(

(3)

&&c1==c2){c1=fgetc(fp1);c2=fgetc(fp2);}if(

(4)

)

printf("Thetwofilesaredifferent!\n");else

printf("Thetwofilesarethesame!\n");

(5)

fclose(fp2);return0;}(1)3(2)(fp2=fopen(argv[2],”r”))==NULL(3)c1!=EOF(4)c1!=c2(5)fclose(fp1);例6:从文本中读入10个整数,排序后输出到二进制文件程序基本结构变量定义(含数组input,两个文件指针)从文件中读入数据

数组input(用fscanf)对数组排序(可设计为函数)将input输出到文件中(用fwrite)排序函数(插入排序算法)voidsort(int*list,intn){ int

i,j,next;

for(i=1;i<n;i++){ next=list[i];

for(j=i-1;j>=0&&next<list[j];j--) list[j+1]=list[j]; list[j+1]=next; }}例6:源程序#include<stdio.h>voidsort(int*list,intn){ int

i,j,next;

for(i=1;i<n;i++){ next=list[i];

for(j=i-1;j>=0&&next<list[j];j--)list[j+1]=list[j]; list[j+1]=next; }}main(){ intinput[10],i; FILE*fpin,*fpout; if((fpin=fopen("in.dat","r"))==NULL){

printf("Cannotopenfilein.dat\n");exit(-1); }

for(i=0;i<10;i++)/*循环读,每次一个整数*/

fscanf(fpin,"%d",&input[i]);

sort(input,10); if((fpout=fopen("out.dat","wb"))==NULL){

printf("Cannotopenfilein\n");exit(-1); }

fwrite(input,sizeof(int),10,fpout);/*input数组一次性写出去*/

fclose(fpin);fclose(fpout);}例6:进一步思考1.如果不是要求读入指定的整数个数(10个),而要求读入文件中的所有整数(但不知个数),怎么办?

2.如果对输入/输出文件类型有以下要求,程序有什么区别?

(1)从文本文件中输入,输出到文本文件

(2)从文本文件中输入,输出到二进制文件

(3)从二进制文件中输入,输出到文本文件

3.打开输出文件(二进制)时,用“wb”。用“w”行吗?关于输入整数个数的处理如果从文本文件中输入指定数目的整数:

for(i=0;i<10;i++)

fscanf(fpin,"%d",&input[i]);如果从文本文件中输入不确定数目的所有整数

while(fscanf(fpin,"%d",&input[i++])==1);如果从二进制文件中输入指定数目的整数

fread(input,sizeof(int),10,fpin);如果从二进制文件中输入不确定数目的整数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论