首页 11.文件操作

11.文件操作

举报
开通vip

11.文件操作null第十一章 第十一章 文件操作 回顾回顾为什么使用结构 如何定义结构及初始化 访问结构成员以及结构指针 结构作为函数参数的用法本章目标本章目标了解文件分类 熟悉流文件的概念 理解文件指针 掌握对文件的读写操作和字符串的输入输出 了解在文件操作中应注意的几个问题 本章结构本章结构文件分类文件操作文件指针流的概念对文件的操作文件操作中的问题C语言文件概述C语言文件概述文件:存储在外部介质上数据的集合,是操作系统数据管 理的单位。 文件分类: 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定...

11.文件操作
null第十一章 第十一章 文件操作 回顾回顾为什么使用结构 如何定义结构及初始化 访问结构成员以及结构指针 结构作为函数参数的用法本章目标本章目标了解文件分类 熟悉流文件的概念 理解文件指针 掌握对文件的读写操作和字符串的输入输出 了解在文件操作中应注意的几个问题 本章结构本章结构文件分类文件操作文件指针流的概念对文件的操作文件操作中的问题C语言文件概述C语言文件概述文件:存储在外部介质上数据的集合,是操作系统数据管 理的单位。 文件分类: 按文件的逻辑结构: 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 文件:由具有一定结构的记录组成(定长和不定长)。 流式文件:由一个个字符(字节)数据顺序组成。 按存储介质: 普通文件:存储介质文件(磁盘、磁带等)。 设备文件:非存储介质(键盘、显示器、打印机等)。 按数据的组织形式: ASCII文件(文本文件):每个字节存放ASCII码,表示一个字符。 二进制文件:数据按其在内存中的存储形式原样存放。null文本文件特点: 存储量大,转换为二进制速度慢,直观易记。二进制文件特点:存储量小,无需转换。 但因一个字节不对应一个字符,故不能直接输出其字符形式。null 文件系统 缓冲文件系统(高级文件系统):系统自动为正在使用的文件开辟内存缓冲区。 非缓冲文件系统(低级文件系统):由用户在程序中为每个文件设定缓冲区。文件类型结构及文件指针 文件类型结构及文件指针 文件类型结构体FILE 缓冲文件系统为每个正使用的文件在内存开辟文件信息区。 文件信息用系统定义的名为FILE的结构体描述。 FILE定义在stdio.h中。typedef struct { short level; /* 缓冲区满/空程度 */ unsigned flags; /* 文件状态 标志 禁止坐卧标志下载饮用水保护区标志下载桥隧标志图下载上坡路安全标志下载地理标志专用标志下载 */ char fd; /* 文件描述符 */ unsigned char hold; /* 若无缓冲区不读取字符 */ short bsize; /* 缓冲区大小 */ unsigned char *buffer; /* 数据传送缓冲区位置 */ unsigned char *curp; /* 当前读写位置 */ unsigned istemp; /* 临时文件指示 */ short token; /* 用作无效检测 */ } FILE ; /* 结构体类型名 FILE */文件指针定义形式 文件指针定义形式 FILE *文件结构指针名; 用法: 文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件。 文件关闭后,它的文件结构体被释放。FILE *fp;文件的打开与关闭 文件的打开与关闭 打开文件fopen 函数首部: FILE *fopen(char *filename,char *mode) 功能:按指定方式打开文件。 返值:正常打开,为指向文件结构体的指针;打开失败,为NULL。要打开的文件名使用文件方式例:文件打开与测试。 FILE *fp; if(( fp=fopen(“filename”,“rb+”))==NULL) { printf(“cannot open this file\n”); exit(0); }例 FILE *fp; fp= fopen (“./test.c“, “rb+“); 系统自动打开和关闭的五个 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 设备文件:null 文件关闭fclose 函数首部:int fclose(FILE *fp) 功能:关闭fp指向的文件,释放文件结构体和文件指针。 返值:正常为0;出错为非0。 文件打开时返回的文件类型指针不关闭文件可能会丢失数据清除流 清除流 清除流 标准输入/输出是经过缓冲的。该函数用来清除缓冲区。如果打开文件进行读操作,该函数函数将清空文件的输入缓冲区;而打开文件进行写操作时,该函数将文件的输出缓冲区写入文件中。 该函数的原型为: int fflush(FILE *fp); 如果成功将返回0,否则返回EOF。 C/C++标准中并没有定义fflush(stdin),但是有些编译器VC++ 6就支持用 fflush(stdin) 来清空输入缓冲。 但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持) 替换: setbuf(stdin, NULL);//清空输入缓冲区 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 文件的读写 文件的读写 字符输出fputc 函数原型:int fputc(int ch, FILE *fp) 功能:把一字符ch写入fp指向的文件中。 返值:正常,返回ch;出错,为EOF。字符输入fgetc 函数原型:int fgetc(FILE *fp) 功能:从fp指向的文件中读取一个字符。 返值:正常,返回读取的字符;读到文件尾或出错时,为EOF。null例:从键盘输入一些字符,逐个把它们存到磁盘文件中,直到输入‘#“结束。#include "stdio.h" main() { char ch, filename[20]; FILE *fp; scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("cannot open this file\n"); exit(0); } while((ch=getchar())!='#') { fputc(ch,fp); putchar(ch); } fclose(fp); }null例:将一个磁盘文件中的信息复制到另一个磁盘文件中,两个文件名由命令行参数给出。#include "stdio.h" main ( int argc; char *argv[]) { int ch; FILE *fpr,*fpw; if (argc!=3) { printf("you forgot to enter a filename\n"); exit(0); } if((fpr=fopen(argv[1],"r"))==NULL) { printf("File %s cannot open\n",argv[1]); exit(0); } if((fpw=fopen(argv[2],"w"))==NULL) { printf("FILE %s cannot open\n",argv[2]); exit(0); } while((ch=fgetc(fpr))!=EOF) fputc(ch,fpw); fclose(fpr); fclose(fpw); }C:>s8_6 file1.c file2.c文件结束feof 函数原型: int feof(FILE *fp) 功能:判断文件是否结束。 返值:文件结束,返回真(非0);文件未结束,返回0。字符串输入输出字符串输入 fgets 函数首部: char *fgets(char *str,int length,FILE *fp); 功能:从fp所指向的文件中,至多读length-1个字符,送入字符数组str中, 如果在读入length-1个字符结束前遇换行符或EOF,读入即结束,字符串读入后在最后加一个‘\0’字符。 返值:正常,返str指针;出错,返空指针NULL。字符串输出 fputs 函数首部: int *fputs(char *str,FILE *fp); 功能:把str指向的字符串写入fp指向的文件。 返值:正常,返0;出错返EOF。字符串输入输出null#include "stdio.h" #define SIZE 256 main( int argc; char *argv[ ]) { char ch[SIZE]; int c,line; FILE *fp; if(argc!=2) { printf("you forgot to enter a filemane\n"); exit(0); } if((fp=fopen(argv[1],"r"))==NULL) { printf("File %s cannot open\n",argv[1]); exit(0); } line=1; while(fgets(ch,SIZE,fp)!=NULL) printf("%4d\t%s\n",line++,ch); fclose(fp); }例:读取文本文件的内容,并加上行号显示。null字段输入fread /输出fwrite 函数首部: int fread(void *buffer,int num_bytes, int count,FILE *fp); int fwrite(void *buffer,int num_bytes, int count,FILE *fp); 功能:读/写数据块。 返值:成功,返回实际读/写的字段个数;出错或文件结束,返回0。 说明: buffer: 指向要输入/输出数据存储区的首地址的指针 num_bytes: 每个要读/写的字段的字节数 count: 要读/写的字段的个数 fp: 要读/写的文件指针 fread与fwrite 一般用于二进制文件的输入/输出。null例 float f[2]; FILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);for(i=0;i<2;i++) fread(&f[i],4,1,fp);例 struct student { int num; char name[20]; char sex; int age; float score[3]; }stud[10]; for(i=0;i<10;i++) fread(&stud[i],sizeof(struct student),1,fp);null从键盘输入4个学生数据,把他们转存到磁盘文件中去。#include #define SIZE 4 struct student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; int main() { int i; for(i=0;i #include main() { char s[80],c[80]; int a,b; FILE *fp; if((fp=fopen("test","w"))==NULL) { puts("can't open file"); exit() ; } fscanf(stdin,”%s%d”,s,&a); /*键盘输入*/ fprintf(fp,”%s %d”,s,a); /*写入文件*/ fclose(fp); if((fp=fopen("test","r"))==NULL) { puts(“can't open file”); exit(); } fscanf(fp,”%s%d”,c,&b); /*从文件读出*/ fprintf(stdout,”%s %d”,c,b);/*屏幕显示*/ fclose(fp); }返 回文件的定位文件位置指针:指向当前读写位置的指针。 rewind函数 函数首部: void rewind(FILE *fp); 功能:使fp所指文件的位置指针重置到文件开头。 返值:无 相当于调用fseek(fp,0,SEEK_SET) 例: 对一个磁盘文件进行显示和复制两次操作。 #include main() { FILE *fp1,*fp2; fp1=fopen(“file1.c","r"); fp2=fopen(“file2.c","w"); while(!feof(fp1)) putchar(getc(fp1)); rewind(fp1); while(!feof(fp1)) putc(getc(fp1),fp2); fclose(fp1); fclose(fp2); }文件的定位文件的定位 fseek函数(移动文件流的读写位置) 函数首部: int fseek(FILE * stream,long offset,int whence); 功能:fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。。 返值:当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码 相当于调用fseek(stream,0,SEEK_SET) 参数whence的说明: SEEK_SET SEEK_CUR SEEK_END #include main() { FILE * fp; long offset; fpos_t pos; fp=fopen(“/etc/passwd”,”r”); fseek(fp,5,SEEK_SET); printf(“offset=%d\n”,ftell(fp)); rewind(fp); fgetpos(fp,&pos); printf(“offset=%d\n”,pos); pos.__pos=10; fsetpos(fp,&pos); printf(“offset = %d\n”,ftell(fp)); fclose(fp); } 文件的定位null#include struct student_type { int num; char name[10]; int age; char sex; }stud[10]; main() { int i; FILE *fp; if((fp=fopen("studd.dat","rb"))==NULL) { printf("can't open file\n"); exit(0); } for(i=0;i<10;i+=2) { fseek(fp,i*sizeof(struct student_type),0); fread(&stud[i],sizeof(struct student_type),1,fp); printf("%s %d %d %c\n", stud[i].name,stud[i].num,stud[i].age,stud[i].sex); } fclose(fp); }例:磁盘文件stud.dat中存有10个学生数据,要求将第1,3,5,7,9个学生数据显示在屏幕上。返 回出错的检测 ferror函数 函数首部:int ferror(FILE *fp); 功能:检测fp所指文件的错误。 返值:未出错,返0;出错,返非0。 说明: (1)每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试。 (2)fopen打开文件时,ferror函数初值自动置为0。出错的检测nullclearerr函数 函数原型:void clearerr(FILE *fp); 功能:使fp所指文件错误标志和文件结束标志置为0。 返值:无。 说明:出错后,错误标志一直保留,直到对同一文件调clearerr()或rewind()函数,或任何其它一个输入输出函数。清除流 清除流 清除流 标准输入/输出是经过缓冲的。该函数用来清除缓冲区。如果打开文件进行读操作,该函数函数将清空文件的输入缓冲区;而打开文件进行写操作时,该函数将文件的输出缓冲区写入文件中。 该函数的原型为: void setbuf(FILE * stream,char * buf); 清空输入缓冲区: setbuf(stdin, NULL); 清空输出缓冲区: setbuf(stdout, NULL); 例5:例5:#include #include int main( void ) { int integer; char string[81]; /*读入四个单词作为并打印*/ printf( "Enter a sentence of four words with scanf: " ); for( integer = 0; integer < 4; integer++ ) { scanf( "%s", string ); printf( "%s\n", string ); } /*必须使用setbuf清除缓冲区*/ setbuf( stdin, NULL ); printf( "Enter the same sentence with gets: " ); gets( string ); printf( "%s\n", string ); }小结:小结: fopen函数:被打开的文件如果在当前目录下,则可以省略路径,否则使用带路径文件名,注意表示各级目录之间使用转义字符‘\\’,而不能使用‘\’。打开文件后,要对返回值进行判断,检查是否打开了文件。只有打开了文件才能继续进行其它操作。 打开文件时,还要注意使用合理的方式打开,打开的目的是读、是写还是读写,还要注意不要误删除已经存在的文件。 在读写文件前,可了解文件中的数据存储形式,数据之间的分隔符号等。 对文件进行读写操作时,要注意文件指针的位置,根据要读写的位置,定位文件指针。 文件操作完毕,注意要及时关闭文件。还要注意如果操作同一个文件,不要频繁的打开和关闭,这样影响程序的性能,可通过移动文件指针来定位。
本文档为【11.文件操作】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_520220
暂无简介~
格式:ppt
大小:1MB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2013-06-03
浏览量:19