清华大学(9) ppt课件_第1页
清华大学(9) ppt课件_第2页
清华大学(9) ppt课件_第3页
清华大学(9) ppt课件_第4页
清华大学(9) ppt课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第 10章 文件操作 1清华大学 黄维通 设计制作 本章主要内容 文件概述 文件的基本操作 文件的读写操作 文件的定位 错误处理 2清华大学 黄维通 设计制作 10 1 文件概述 3清华大学 黄维通 设计制作 文 件 10 1 1 文件的概念 程序文件 数据文件 存储在外 部介质上 的数据的 集合 在 C 语言中, 文件可以看作 字节的序列, 根据文件的数 据组织形式, 可以分为 ASCII 文件和二进制 文件。 4清华大学 黄维通 设计制作 ASCII形式与 二进制 形式的比较 每一个字节放 一个 ASCII代 码,代表一个 字符 把数据按其在内存中 的存储形式原样输出 到磁盘上存放 5清华大学 黄维通 设计制作 FILE结构类型由系统定义,其格式各编 译系统略有差别,大致如下: struct _iobuf int _cnt; /输入缓冲区中等待取的字符个数 int _fd; /文件号,或通道号 int _flag; /I/O错误标志,有错则为非 0 char *_base; /指向 I/O缓冲区的首地址 char *_ptr; /指向当前所取的字符 char *_fname; /指向文件识别名 typedef struct _iobuf FILE; 6清华大学 黄维通 设计制作 对于每一个要操作的文件,都必须定义 一个指向结构文件的指针变量 FILE *文件类型指针名; 如果程序中同时要处理几个文件,则 应该定义几个文件类型指针,例如: FILE *fp1, *fp2, , *fpn; 7清华大学 黄维通 设计制作 缓存的概念 系统为打开的文件在内存中开辟的一块 区域,当数据从内存向磁盘输出的时候 ,数据先送到缓存中,等缓存满了或者 程序请求清空缓存时,数据才被写入磁 盘 8清华大学 黄维通 设计制作 标准 I/O 的三 种缓 存 全缓存 :缓存被充满后系统才 进行实际的文件操作 ,效率高 行缓存 : 当输入或者输出中遇 到行结束标志的时候,标准 I/O库才执行实际的 I/O操作 。 无缓存 : 在无缓存的情况下, 每一次操作都是对外部介质的 操作,效率比较低。 9清华大学 黄维通 设计制作 10.2 文件的基本操作 10清华大学 黄维通 设计制作 FILE * fopen(const char * filename, const char mode);r: 可读 w: 可写;若文件不存在则创建;若存在,长度截为 0 a: 添加;若文件不存在则创建;若文存在,则从末尾 添加 r+: 可读写 w+: 可读写;类似 w方式 a+: 可读并添加 rb,wb,ab,r+b,rb+,w+b,wb+,a+b,ab+: 与没有 b标志的 模式功能相同,对象为二进制文件 1 文件的打开 11清华大学 黄维通 设计制作 使用 fopen()函数打开文件时,一 般要检查文件打开的正确性,以便确 定程序能否继续执行下去。例如: if(fp=fopen(”test”, ”r”)=NULL) printf(”This file cant be opened! n”) ; exit(1); 12清华大学 黄维通 设计制作 3 文件的删除 int remove(const char * filename) int rename(const char *old, const char *new) 4文件的重命名 char * tmpnam(char *s) FILE *tmpfile(void) 5 临时文件的创建 以 wb+形式创建临 时二进制文件 int fclose(FILE * stream); 2 文件的关闭 每调用一次 , 就产生一个不 同文件名,最 多调用次数为 TMP_MAX, 该宏 定义在 stdio.h中 13清华大学 黄维通 设计制作 【例 】 tmpnam和 tmpfile函数的使用 #include #include int main(void) char name20,line20; /定 义 字符数 组 ,用以存放文件名 FILE * fp; printf(“%sn“, tmpnam(name); /输 出 创 建的第一个 临时 文件名 tmpnam(name); /创 建第二个 临时 文件 14清华大学 黄维通 设计制作 printf(“%sn“,name); /输 出第二个 临时 文件名 if( (fp=tmpfile()=NULL) /判断是否 创 建了 临时 文件 perror(“create temp file failed!n“); fputs(“hello temp file!n“,fp); /将 fp指 针 指向字符串,并移到尾部 rewind(fp); /将 fp指 针 指回到字符串的首地址 15清华大学 黄维通 设计制作 if(fgets(line,sizeof(line),fp)=NULL) /将字符串存放在 line数 组 中 perror(“fgets failed!“); fputs(line,stdout); /将 line数 组 中的内容 输 出到屏幕 exit(0); 运行结果如下 : Tmp1.$ Tmp2.$ hello temp file! 16清华大学 黄维通 设计制作 文件的读写包括非 格式化读写和格式化读 写,它们的用法不同, 功能也不同 10.3 文件的读写操作 17清华大学 黄维通 设计制作 (1) 每次一个字符的读写 int fgetc(FILE * stream); 注意: 由于是将 usigned char转换为 int, 因此 正常字符的范围只能是 0255 ANSI C中还定义了 getc函数,该函数可 能是由宏实现的,因此效率可能比较高 。 ANSI C中还定义了 getchar函数,该函 数相当于 fgetc(stdin)。 10.3.1 文件的非格式化读写 18清华大学 黄维通 设计制作 向流中写入一个字符: int fputc(int c, FILE * stream); 这个函数实现的功能是将 c输到 stream 流的当前位置 注意: 对应 getc和 getchar, ANSI C中定义了 putc和 putchar, 功能同 fputc。 fputc(char c, FILE *stdout); 输出一个字符,等价 putchar(char c); stdprn为向 打印机输出 19清华大学 黄维通 设计制作 【例】编制程序,运行该程序后可以显示 指定文件的内容。例如,假设编译后生成 typefile.exe文件,则命令行的格式为: typefile filename.txt 其程序如下: #include “stdio.h“ #include “stdlib.h“ void main(int argc,char *argv) int ch; FILE *fp; 20清华大学 黄维通 设计制作 if(fp=fopen(argv1,“r“)=NULL) printf(“The file:%s cant be opened“, argv1); exit(1); ch=fgetc(fp); /读 取字符 while (ch!=EOF) putchar(ch); /逐个 输 出字符 ch=fgetc(fp); /读 取字符 printf(“argc is %d“, argc); fclose(fp); 21清华大学 黄维通 设计制作 (2) 每次一行的读写 char *fgets(char * buf, int n, FILE *stream) 注意: l如果一行超过了 n, 那么只读取其中的 n-1个,最后还是以 NULL结尾。 l 通常 n比欲读取的数据的长度少一,即 n长度的 buf总要为 NULL留一个位置。 ANSI C中可以使用如下函数来向流中写 入一行内容: int fputs(const char * str, FILE * stream) 22清华大学 黄维通 设计制作 【例】基于行的 I/O的使用。 #include #include void main(void) char * buf; int n= 16; buf=(char *)malloc(n);/开辟存 储 空 间 while( fgets(buf,n,stdin) != NULL ) fputs(buf,stdout); puts(buf); 23清华大学 黄维通 设计制作 运行上面的程序,如果输入字符串 12345, 运行结果如下: 12345 12345 12345 如果输入字符串 abcdefghijklmnopqrst,运 行结果如下: abcdefghijklmnopqrst abcdefghijklmnoabcdefghijklmno pqrst pqrst 24清华大学 黄维通 设计制作 【例】有两个文本文件,把第二个文本 文件接在第一个文本文件后面的功能。 #include “stdio.h“ #include “stdlib.h“ #define SIZE 512 main(int argc,char *argv) int i; char bufferSIZE; FILE *fp1,*fp2; if (argc!=3) printf(“Error! “); exit(0); if (fp1=fopen(argv1,“a“)=NULL) printf(“file %s cant be opened n“, argv1); exit(0); 25清华大学 黄维通 设计制作 if (fp2=fopen(argv2,“r“)=NULL) printf(“file %s cant be openedn“, argv2); exit(0); while(fgets(buffer,SIZE,fp1)!=NULL) /读 取 file1文件内容存入 buffer数 组 printf(“n%s“,buffer);/ 输 出 file1内容 while(fgets(buffer,SIZE,fp2)!=NULL) /读 取 file2文件内容存入 buffer数 组 fputs(buffer,fp1); /将 file2的内容接在 file1文件后面 fclose(fp1); fclose(fp2); 26清华大学 黄维通 设计制作 if(fp1=fopen(argv1,“r“)=NULL) /将 fp1指 针 重定向到 file1文件 printf(“file %s failn“, argv1); exit(0); while(fgets(buffer,SIZE,fp1)!=NULL) /读 取 file1内容 printf(“n%s“,buffer); /输 出 file1内容 fclose(fp1); 27清华大学 黄维通 设计制作 /* 把文件 A的内容复制到文件 B中 */ #include main() int c; FILE *fpr,*fpw; char file130,file230; scanf(“%s%s“,file1,file2); if (fpr=fopen(file1,“r“)=NULL) printf(“n file%s failn“,file1); exit(); if (fpw=fopen(file2,“w“)=NULL) printf(“file %s failn“,file2); exit(); while(c=fgetc(fpr)!=EOF) fputc(c,fpw); fclose(fpr); fclose(fpw); 28清华大学 黄维通 设计制作 (3) 直接 I/O 这类操作每次都需要指定操作的长度, 通常用于二进制文件的读写 ANSI C为我们提供了具有这个功能的函数。 size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream) 功能 : 从 stream中读取 nmemb次大小为 size的 元素到 ptr中,其中 ptr是数据存储的起始位置 , size是每个元素的字节大小, nmemb是要读 取的次数, stream是已打开的文件指针。 29清华大学 黄维通 设计制作 类似的有按照二进制形式写入文件的 函数: size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE * stream) 该函数的功能是向 stream流中写入大 小为 size的元素,写的次数为 nmemb。 30清华大学 黄维通 设计制作 【例】 现 有一个关于学生信息的磁 盘 文 件 file1, 把 该 文件存入另一个文件 file2 中 #include “stdio.h“ #include “stdlib.h“ #define SIZE 4 / 宏定 义 struct stu / 定 义结 构体 int id; / 结 构体成 员 char name20; int age; ; 31清华大学 黄维通 设计制作 main() / 主函数 struct stu stu1; / 定 义结 构体 变 量 int n; FILE *in,*out; /定 义 文件 类 型指 针 if(in=fopen(“file1.txt“,“rb“)=NULL) puts(“The file1 cant be opened“); exit(0); if(out=fopen(“file2.txt“,“wb“)=NULL) puts(“The file2 cant be opened “);exit(0); while(fread( fclose(in); fclose(out); 32清华大学 黄维通 设计制作 10.3.2 文件的格式化写操作 ANSI C提供了如下的格式化输出函数 int fprintf(FILE * stream, const char * format, argument,) 功能:据 format指定的格式向 stream中 输入字符串 其中: stream: 已打开的文件指针 format: 指定的写格式串 argument:输出变量列表 33清华大学 黄维通 设计制作 【例】 编 写程序, 实现显 示文件内容、 存 储 和 为 文件加行号的功能,如果 实现 此功能的程序的 执 行文件 为 display.exe , 则 要求 执 行 该 程序的命令行格式 为 : display -i -s filename -i和 -s两个 选项 意 义 如 下: 不指定 -i和 -s 只 显 示 filename文件的内容 指定 选项 -s 显 示并存 储 filename文件的内容 指定 选项 -i 对显 示文件的每一个加行号 同 时 指定 -i和 -s 把文件的每一行加行号后 显 示并存 储 34清华大学 黄维通 设计制作 #include “stdio.h“ #include “stdlib.h“ #include “string.h“ #define SIZE 100 void main(int argc,char *argv) char bufferSIZE,*filename; FILE *in,*out; int n,count=1 /count:行 计 数器 int sflag=0, /sflag:储 存 标 志, int iflag=0; /iflag:加行号 标 志 if(argc4) /参数个数正确否 ? puts(“Command line should be : display -i-s filename“); exit(1); 35清华大学 黄维通 设计制作 for (n=1;n main() int a; char s80; FILE *fp; if (fp=fopen( ,“w“)=NULL) puts(“can not open file“); exit(); fscanf(stdin,“%s%d“,s, fprintf(fp,“%s %d“,s,a); fclose(fp); if (fp=fopen( ,“r“)=NULL) puts(“cannot open file“); exit(); fscanf(fp,“%s%d“,s, fprintf(stdout,“%s %dn“,s,a); fclose(fp); “e:tctest“ “e:tctest“ 42清华大学 黄维通 设计制作 fread,fwrite include: 语法: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 参数: buffer: 读 /写数据的存放首地址 size: 每次要写 /读的字节数 count: 读 /写次数 fp: 文件指针 返回:实际读 /写的次数 . 功能:从文件中连续读入 count 次,字节数为 size 的数据块,存放在起始地址为 buffer 的内存区域。 43清华大学 黄维通 设计制作 /* 把一组数据写到文件中,然后再输出到屏幕上 */ #include #define SIZE 4 void save() FILE *fp; int i; if(fp=fopen(“stu_list“,“wb+“)=NULL) printf(“cannot open filen“); return; for (i=0;i语法: int putw(int w,FILE *fp); 参数: w: 要写入文件中的整数 功能:以二进制形式,向文件中写一个 int 型的整数。 其他读写函数 include: 语法: int getw(FILE *fp); 功能:从文件中读一个二进制整型数。 getw 46清华大学 黄维通 设计制作 fgetsinclude: 语法: char *fgets(字符数组地址 , n, fp); 功能: 从文件中读入 n-1 字符,存入字符数组 include: 语法: int fputs(字符串首地址 , fp); 功能:将字符串写入文件中,自动舍弃末尾 fputs 47清华大学 黄维通 设计制作 /* 显示文本文件的内容并加行号 */ #include #define n 256 main() char buffn, file20; int c,lcnt; FILE *fp; puts(“Input a file name:“); scanf(“%s“,file); if(fp=fopen(file,“r“)=NULL) printf(“nfile %s failn“,file); exit(); lcnt=0; while(fgets(buff,n,fp)!=NULL) printf(“%3d:%s“,+ lcnt,buff); fclose(fp); 48清华大学 黄维通 设计制作 /* 连接两个文本文件 */ #include #define BUFSIZE 256 main() int i; FILE *fp1,*fp2; char buffBUFSIZE,file115,file215; puts(“Input the file names:“); scanf(“%s%s“,file1,file2); if(fp1=fopen(file1,“a“)=NULL) printf(“file %s failn“,file1); exit(); if (fp2=fopen(file2,“r“)=NULL) printf(“file %s fialn“,file2); exit(); while(fgets(buff,BUFSIZE,fp2)!=NULL) fputs(buff,fp1); fclose(fp2); fclose(fp1); 49清华大学 黄维通 设计制作 在对文件进行操作时,不 一定始终都是从文件的开始位 置进行操作的,因此,对文件 的定位非常重要, TC提供了 一系列的文件定位的函数 10.4 文件的定位 50清华大学 黄维通 设计制作 ANSI C对该函数定义如下: int fgetpos(FILE * stream, fops_t * pos) 功能 :获得 stream中文件指针当前的位置 ,存储在 pos变量中, pos是保存文件指针 的位置信息。 该函数和 fsetpos是 ANSI C新增加的,该 它可获得文件当前的位置,当以后调用 fsetpos的时候可以重新将流定位到该位置 10.4.1 fgetpos函数 51清华大学 黄维通 设计制作 ANSI C对该函数定义如下: int fsetpos(FILE * stream, const fops_t * pos) 该函数的功能是设置文件指针的偏移 位置,函数运行如果成功,返回 0;如果 失败,返回非 0,并设置 errno, 该函数 使用的 pos, 通常都是以前从 fgetpos函数 得到的 10.4.2 fsetpos函数 52清华大学 黄维通 设计制作 ANSI C对该函数定义如下: long int ftell(FILE * stream) 该函数的功能是获得 stream中 文件指针当前的位置,该函数如果运 行成功,返回文件指针位置;如果失 败,返回 -1L, 并设置 errno。 10.4.3 ftell函数 53清华大学 黄维通 设计制作 ANSI C对该函数定义如下 int fseek(FILE * stream, long int offset, int whence) 功能:是控制文件指针在流当中的位置, offset表示位移的偏移量 , whence是计算相对 位移量的基点 ,它可取 0、 1和 2三个值之一。 base取 值 命名 含 义 0 SEEK_SET 文件开 头 1 SEEK_CUR 文件当前位置 2 SEEK_END 文件末尾 10.4.4 fseek函数 54清华大学 黄维通 设计制作 fseek(fp, 200L, SEEK_SET); /将文件 读 /写位置指 针 移到距文件 开 头 200个字 节 的位置 fseek(fp, 150L, 1); / 将

温馨提示

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

评论

0/150

提交评论