《《C语言13-Files文库》-精选课件(公开PPT)》由会员分享,可在线阅读,更多相关《《C语言13-Files文库》-精选课件(公开PPT)(20页珍藏版)》请在金锄头文库上搜索。
1、文件,吴清锋 2007年秋,提纲,概述 文件的概念 ASCII文件和二进制文件 “缓冲文件系统”和“非缓冲文件系统” 文件操作 文件类型指针 文件的打开与关闭 文件的读写 文件的定位 出错的检测,结束,文件的概念,文件是程序设计中的一个重要的概念。所谓“文件”一般指存储在外部介质上数据的集合(功能类似现实文件)。操作系统以文件为单位管理数据(其含义?P330)。 文件使得数据可以长期保存。 从操作系统的角度看,每个与主机相联的输入输出设备都看成是一个文件(这可以从后面将要介绍的文件I/O函数和以前所介绍的终端I/O函数的类似性看出)。,返回,ASCII文件和二进制文件,C语言将文件看成一个字符
2、(字节)的序列(流),即由一个个字符(字节)顺序组成。 根据数据的组织方式: ASCII文件又称为文本文件(侧重字符(字节)流) 二进制文件(侧重二进制流) 用ASCII码形式输出与字符一一对应,一个字节代表一个字符,便于对字符进行逐个处理,也便于输出,但占存储空间较多,而且要花费转换时间。 内存中的数据用二进制形式输出数值,可以节省外存空间和转换时间,但不能直接输出字符形式。一般适用于保存中间结果。 C文件是一个字节流或二进制流。它不考虑文件的内容,文件的内容如何解释完全依赖于相应的存取程序。,返回,缓冲文件系统和非缓冲文件系统,缓冲文件系统是指系统自动地在内存区中为每一个正在使用的文件名开
3、辟一个缓冲区。内存和磁盘的数据交换必须通过该缓冲区(大小一般为512字节)。 而非缓冲文件系统则指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。 ANSI C标准决定不采用非缓冲文件系统。 在C中没有输入输出语句,对文件的读写都是用库函数来实现的。,返回,文件类型指针,每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。 这些信息放在类型为FILE(在stdio.h中定义)的结构体变量中(P331) 应用一:使用FILE类型可以定义若干个FILE类型的变量,以便存放若干个文件信息。而使用其中的信息又可以访问相应的文件。 应用二
4、:由于多数的文件处理函数,要求传递的参数和返回值是FILE类型的结构体指针,所以用得较多的是如下的定义:FILE * fp;,返回,文件的打开与关闭(1):fopen,对文件读写前应该“打开”文件,使用后应“关闭”。 原型:#include FILE * fopen (const char * filename , const char * mode); 返回值:成功时返回打开的文件指针,失败时返回NULL。 常用的方式(P332,注意如何使用函数以及赋值) 注意: mode指定了文件的打开模式(取值) 文件打开不一定是成功的,如果不成功,返回的是NULL。对该指针进行操作将是危险的,所以一般
5、要进行出错判断(形式) 对文本文件进行输入输出时,换行符将进行转换:输出时,换行符转换成换行加回车;输入时则相反。,文件的打开与关闭(2):fclose,何谓“关闭”文件? 原型:#include int fclose (FILE * fp); 返回值:成功时返回0,失败时返回EOF。 注意:要养成不使用文件时及时关闭的好习惯。(否则对文件的更改并不一定真正生效),返回,文件的读写(1),fputc函数 函数的功能 #include int fputc (int ch , FILE * fp); 成功返回所输出的字符,否则返回一个EOF。 三个标准文件指针:stdin,stdout,stder
6、r(P334) #define putchar(c) fputc (c , stdout) fgetc函数 函数的功能 #include int fgetc (FILE * fp); 成功时返回所读取的字符,否则读到文件结束符时返回EOF。,文件的读写(2),如何判断是否到达文件的末尾 用EOF:仅适用于文本文件 c=fgetc(fp); while (c!=EOF) c=fgetc(fp); feof #include int feof (FILE * fp); 当没有遇到文件结束时,返回0,否则返回1。 while (!feof (fp) c=fgetc(fp); 示例,文件的读写(3),
7、fread函数和fwrite函数:读写一个数据块 #include size_t fread(void * ptr, size_t size, size_t n, FILE * fp); size_t fwrite(const void * ptr, size_t size, size_t n, FILE * fp); 成功时返回值为n。 fprintf函数和fscanf函数 #include int fprintf (FILE * fp , const char * format , ); int fscanf (FILE * fp , const char * format , );,文件
8、的读写(4),用来对磁盘文件读写一个字(整数) #include int putw (int w , FILE * fp); int getw (FILE * fp); 用来对制定的文件输入和输出一个字符串 char * fgets (char * s , int n , FILE * fp); 从fp指向的文件读入n-1个字符(如果提前遇到换行符或EOF,可能更少),然后加上一个0。返回值为s的首地址。 int fputs (char * s , FILE * fp); 成功时返回0,否则返回EOF。和puts不同,不会自动加上换行回车。,返回,文件的定位(1),文件中的位置指针:指向当前读
9、写的位置 rewind函数 #include void rewind (FILE * fp); 将文件读写指针移到文件的开头 fseek函数(实现随机读写) #include int fseek (FILE * fp , long offset , int whence); whence的取值:SEEK_SET(0) SEEK_CUR(1) SEEK_END(2),文件的定位(2),如果文件读写指针按字节位置顺序移动,则为顺序读写。而如果能将读写指针按需要移动到任意的位置,当读写完当前字符后不一定要读写其后继字符,而可以读写文件中任意所需的字符,这就是所谓的随机读写。 ftell函数 #inc
10、lude long ftell (FILE * fp); 给出流式文件相对于文件开头的当前位置,返回-1L时为出错,返回,出错的检测(1),ferror函数 #include int ferror (FILE * stream); 如果没有出错,则返回0,否则返回一个非零值。 对同一个文件的每一次调用输入输出函数,均产生一个新的ferror函数值,因此应当在调用一个输入输出函数时立即检查,否则信息可能丢失。 执行fopen函数时,ferror函数的初始值自动置0。,出错的检测(2),clearerr函数 #include void clearer (FILE * fp); 使文件的错误标志和结
11、束标志置为0 只要出现错误标志,其值将一直保持到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。,返回,文件打开模式,“r”(文件必须已经存在) “w”(文件若已经存在将先被删除后再被新建) “a”(文件不存在则新建,存在则文件指针指到文件末尾) “rb”、“wb”、“ab” “r+”、“w+”、“a+” “rb+”、“wb+”、“ab+”,返回,打开失败的检测,if (fp=fopen (“file.c”,“r”)=NULL) printf(“cannot open this filen”); exit(1); ,返回,示例(1),将一个文件拷贝到另一个文件
12、 #include main(int argc , char * argv) FILE * in , * out; char ch; if(argc!=3) printf(Usage:%s n,argv0); exit(1); if(in=fopen(argv1,r)=NULL) printf(cannot open %sn,argv1); exit(1); if(out=fopen(argv2,w)=NULL) printf(cannot open %sn,argv2); fclose(in); exit(1); ch=fgetc(in); while(ch!=EOF) fputc(ch,o
13、ut); ch=fgetc(in); fclose(in); fclose(out); ,示例(2),将一个文件拷贝到另一个文件 #include main(int argc , char * argv) FILE * in , * out; if(argc!=3) printf(Usage:%s n,argv0); exit(1); if(in=fopen(argv1,r)=NULL) printf(cannot open %sn,argv1); exit(1); if(out=fopen(argv2,w)=NULL) printf(cannot open %sn,argv2); fclose(in); exit(1); while(!feof(in) fputc(fgetc(in),out); fclose(in); fclose(out); ,返回,