1 / 20

第 10 章 文件

输出. 输出. 磁盘 文件. 输入. 输入. 第 10 章 文件. 10.1 文件操作库函数. 一、 概述. C 语言将文件看作是一个字符 ( 字节 ) 序列组成的。分为 ASCII 文件 和 二进制文件 两种。. C 的“缓冲文件系统”自动地在内存中开辟一个文件缓冲区 , 在对文件进行处理时 , 通过文件缓冲区进行输入与输出。. 输出 缓冲区. 程序 数据区. 输入 缓冲区. 二、 文件类型指针. “ 文件指针”是缓冲文件系统中的一个重要概念。在 C 系统的头文件 stdio.h 中定义了一个名叫 FILE 的结构体类型:

tauret
Download Presentation

第 10 章 文件

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 输出 输出 磁盘 文件 输入 输入 第 10 章 文件 10.1 文件操作库函数 一、 概述 C语言将文件看作是一个字符(字节)序列组成的。分为ASCII文件和二进制文件两种。 C的“缓冲文件系统”自动地在内存中开辟一个文件缓冲区, 在对文件进行处理时, 通过文件缓冲区进行输入与输出。 输出 缓冲区 程序 数据区 输入 缓冲区

  2. 二、 文件类型指针 “文件指针”是缓冲文件系统中的一个重要概念。在C系统的头文件stdio.h中定义了一个名叫FILE的结构体类型: typedef struct {short level; /*缓冲区饱和程度 */ unsigned flage; /*文件状态标志 */ char fd; /*文件号 */ unsigned char hold; /*无缓冲区取消字符输入 */ short bsize; /*缓冲区大小, 缺省值512 */ unsigned char *buffer; /*缓冲区 */ unsigned char *curp; /*当前活动指针 */ unsigned istemp; /*草稿文件标识 */ short token; /*作正确性检验 */ }FILE ;

  3. 有了FILE类型之后,就可以用它来定义FILE类型的变量。如:有了FILE类型之后,就可以用它来定义FILE类型的变量。如: FILE –efile[–MAKFILE]; 定义了一个结构体数组–file[ ], 程序中最多可使用MAKFILE个文件。又如: FILE *fp; fp为指向FILE类型结构体的指针变量。使fp指向某一文件结构体变量后,就通过该结构体变量中的文件信息访问该文件。如果有n个文件,一般应设n个FILE类型结构体指针变量指向n个文件的信息结构体,以实现对文件的访问。

  4. 10.2 文件操作 在对文件读、写之前必须先打开该文件,使用结束后应关闭该文件。 一、 文件打开函数 fopen 函数调用格式: FILE *fp; fp=fopen(“文件名”,“使用方式”); 打开指定的文件,以指定的使用方式进行访问。 说明:  用fp指向打开的文件后, 就可以用它来访问该文件。  “文件名”为任何合法的DOS文件名。  有的C 版本只用r、w、a,或只用rw、ra 而不用r+、w+、a+ 在程序运行时,系统自动打开三个标准文件stdin、stdout、stderr。

  5. 文本文件中的回车换行符在输入时转换为一个换行符,在输出时又转换为回车换行符。文本文件中的回车换行符在输入时转换为一个换行符,在输出时又转换为回车换行符。 为了可靠地打开指定的文件, 常用下列方法:if ((fp=fopen(“file1” , “ r ”))==NULL) {printf(“cannot open this file\n”); exit(0); } 二、 文件关闭函数 fclose 使用完一个文件后必须关闭它,以防数据丢失和被其它操作误用。 fclose函数的调用格式: fclose(文件指针); 关闭文件时的操作就是使指针与文件“脱钩”。正常关闭时fclose函数返回0值,关闭有误时返回非0值。

  6. 三、 文件的读写 1、 fgetc函数 fgetc函数的功能是从以读或读写方式打开的文件中读入一个字符。调用格式: ch=fgetc(fp); ch是要读入的字符;fp为指向文件的文件类型指针。 2、 fputc函数 fputc函数的功能是将一个字符写入以写方式打开的磁盘文件。调用格式: fputc(ch , fp); ch是要输出的字符;fp为指向文件的文件类型指针。 EOF为标准文件的结束标志。在流式文件中,文件结束标志为feof。当fp指向的文件遇到文件结束标志时,feof(fp)=1,否则为0。

  7. 3、 fread函数 和 fwrite函数 它们是ANSI C 标准提供的函数。调用格式为: fread(buffer, size, count, fp); fwrite(buffer, size, count, fp); buffer为指向fread读入数据存放的起始地址或fwrite输出数据的起始地址的指针。 size为读写的字节数。 fp为文件类型指针。 count为读写size字节的数据项的个数。 • 如果fread或fwrite调用成功,则函数返回值为count的值,即输入或输出数据项的完整个数。  如果文件以二进制形式打开,则fread和fwrite函数就可以读写任意类型的数据。如: fread(f, 4, 2, fp); 从fp所指的文件读入2个数据存储到实型数组 f 中。

  8. 4、 fprintf和 fscanf 函数 调用格式:fprintf(文件指针, 格式字符串, 输出项表); fscanf(文件指针, 格式字符串, 输入项表);fprintf 和fscanf 函数与printf 和scanf 函数的不同之处是:前者的对象为磁盘文件,而后者的对象为终端。 5、 putw和 getw函数 调用格式: putw(i, fp); /将整型量i输出到fp指向的文件 / i=getw(fp);/从fp指向的文件中读入一个 并赋给整型变量i /

  9. 6、 fgets 和 fputs函数 fgets函数的调用格式: fgets(str, n, fp); 从fp指向的文件中读入n–1个字符并放到字符数组str中。该函数的返回值为str的首地址。 fputs函数的调用格式: fputs(str,fp); 将一个字符串输出到fp指向的文件中。这里的str可以是字符串常量、字符串数组名或字符型指针。输出成功,函数值为0,失败时为非0。

  10. 例10.1 将一个磁盘文件中的信息复制到另一个磁盘文件中。 用带参数的main函数编写。

  11. 7、 读写其它类型的数据 ANSI C 标准的 fread 和 fwrite 函数可以读写任何类型的数据。当用户使用的系统未提供这两个函数时,可以定义所需的函数。如以二进制方式写入一个实数 num 至 fp 指向之文件的函数可以定义如下: putfloat(num, fp) float num; FILE *fp; {char *s; int count; s=&num; for (count=0; count<4; count++) putc(s[count], fp); }

  12. 四、 文件的定位 1、 rewind函数 rewind函数的作用是将文件指针重置于文件的开头。 例10.2 将一磁盘文件显示在屏幕上并复制到另一文件。 #include “stdio.h” main( ) {FILE *fp1, *fp2; fp1=fopen(“file1.c”, “r”); fp2=fopen(“file2.c”, “w”); while ( !feof(fp1)) putchar(fgetc(fp1) ); rewind(fp1); while ( !feof(fp1)) fputc(fgetc(fp1), fp2); fclose(fp1); fclose(fp2); }

  13. 2、 fseek函数与文件的随机读写 C的流式文件既可以顺序读写也可以随机读写。 fseek的调用格式: fseek( fp, 位移量, 起始点); 其中:fp为指向文件的指针; 起始点 代码 ANSI C标准的指定名 文件开头 0 SEEK_SET 文件当前位置 1 SEEK_CUR 文件末尾 2 SEEK_END 位移量是以“起始点”为基点向前移动的字节数。ANSI C规定在位移量的末尾加上字母L表示long型,以便在读写大于64K的文件时不致出错。例如:

  14. fseek(fp,100L,0); /*将指针移到离文件头100个字节处 */ fseek(fp,50L,1); /*将指针移到离当前位置50个字节处*/ fseek(fd,–10L,1); /*将指针从当前位置倒退10个字节 */ fseek(fp,–10L,2); /*将指针移到文件末倒数10个字节处*/ 3、 ftell函数 调用格式: i = ftell(fp); 该函数得到fp指向的流式文件中fp的当前位置并赋给变量 i 。 如果ftell函数的返回值为–1L,表示出错。

  15. 五、 出错的检查 1、 ferror函数 调用格式: ferror(fp); 该函数用来检查各种输入输出函数(如fputc、fgetc、fread、fwrite等)的操作是否有错。若有错,函数的返回值为非0 ,若无错,函数的返回值为0。 2、 clearerr函数 调用格式: clearerr(fp); 调用该函数后,使文件错误标志和文件结束标志及ferror(fp)之值均变为0。

  16. 六、 非缓冲文件系统 非缓冲文件系统不属于ANSI C标准的范围,但了解它对于阅读非ANSI C标准程序时不致感到困难。 缓冲文件系统称为高级磁盘I/O系统,它通过指针访问文件。非缓冲文件系统称为低级磁盘I/O系统,它不是通过指针访问文件,而是用一个整数代表一个文件。这个正整数称为“文件号”。 C编译系统允许同时最多打开10个文件,且按文件打开的先后顺序自动将文件号定为1~10。

  17. 1、 open函数 调用格式: open(文件名, 打开方式); 该函数用来打开一个非缓冲文件。 其中: 打开方式 作用 0       只读 1       只写 2       读/写 若打开成功,该函数返回一个正整数(文件号),否则返回–1。 2、 close函数 调用格式: close(fd); 关闭由正整数fd代表的非缓冲文件。 若关闭成功,该函数返回值为0 ,否则返回值为–1。

  18. 3、 reat函数 Turbo C不允许用open函数建立新文件,而提供一个 creat 函数用来建立新文件。调用格式: creat(文件名, 打开方式); 若建立成功,该函数返回一个正整数(文件号),否则返回–1。 4、 read 函数 调用格式: read(fd, buf, count); read函数的作用是从正整数fd代表的非缓冲文件中读出count个字节的信息到buf指向的缓冲区中。读出成功,read函数返回值为读出的字节数,遇文件结束,read函数返回值为0,否则为–1。

  19. 5、write函数 调用格式: write(fd, buf, count); write函数的作用是将buf指向的缓冲区中count个字节的信息写入正整数fd代表的非缓冲文件中。写入成功,write函数返回值为写入的字节数,否则为–1。 6、 lseek函数和随机读写 lseek函数用来移动文件位置指针。其调用格式: lseek(文件号, 位移量, 起始点) lseek函数的作用类似于fseek函数,不同之处是用文件号而不是用指针来标识文件。 例: lseek(fd,100L,0); /将文件位置指针移到离文件开头100字节处 / lseek(fd,–10L,1); /将文件位置指针从当前位置倒退10字节 /

  20. 本章习题 P259 10.37 10.38 本

More Related