200 likes | 351 Views
输出. 输出. 磁盘 文件. 输入. 输入. 第 10 章 文件. 10.1 文件操作库函数. 一、 概述. C 语言将文件看作是一个字符 ( 字节 ) 序列组成的。分为 ASCII 文件 和 二进制文件 两种。. C 的“缓冲文件系统”自动地在内存中开辟一个文件缓冲区 , 在对文件进行处理时 , 通过文件缓冲区进行输入与输出。. 输出 缓冲区. 程序 数据区. 输入 缓冲区. 二、 文件类型指针. “ 文件指针”是缓冲文件系统中的一个重要概念。在 C 系统的头文件 stdio.h 中定义了一个名叫 FILE 的结构体类型:
E N D
输出 输出 磁盘 文件 输入 输入 第 10 章 文件 10.1 文件操作库函数 一、 概述 C语言将文件看作是一个字符(字节)序列组成的。分为ASCII文件和二进制文件两种。 C的“缓冲文件系统”自动地在内存中开辟一个文件缓冲区, 在对文件进行处理时, 通过文件缓冲区进行输入与输出。 输出 缓冲区 程序 数据区 输入 缓冲区
二、 文件类型指针 “文件指针”是缓冲文件系统中的一个重要概念。在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 ;
有了FILE类型之后,就可以用它来定义FILE类型的变量。如:有了FILE类型之后,就可以用它来定义FILE类型的变量。如: FILE –efile[–MAKFILE]; 定义了一个结构体数组–file[ ], 程序中最多可使用MAKFILE个文件。又如: FILE *fp; fp为指向FILE类型结构体的指针变量。使fp指向某一文件结构体变量后,就通过该结构体变量中的文件信息访问该文件。如果有n个文件,一般应设n个FILE类型结构体指针变量指向n个文件的信息结构体,以实现对文件的访问。
10.2 文件操作 在对文件读、写之前必须先打开该文件,使用结束后应关闭该文件。 一、 文件打开函数 fopen 函数调用格式: FILE *fp; fp=fopen(“文件名”,“使用方式”); 打开指定的文件,以指定的使用方式进行访问。 说明: 用fp指向打开的文件后, 就可以用它来访问该文件。 “文件名”为任何合法的DOS文件名。 有的C 版本只用r、w、a,或只用rw、ra 而不用r+、w+、a+ 在程序运行时,系统自动打开三个标准文件stdin、stdout、stderr。
文本文件中的回车换行符在输入时转换为一个换行符,在输出时又转换为回车换行符。文本文件中的回车换行符在输入时转换为一个换行符,在输出时又转换为回车换行符。 为了可靠地打开指定的文件, 常用下列方法:if ((fp=fopen(“file1” , “ r ”))==NULL) {printf(“cannot open this file\n”); exit(0); } 二、 文件关闭函数 fclose 使用完一个文件后必须关闭它,以防数据丢失和被其它操作误用。 fclose函数的调用格式: fclose(文件指针); 关闭文件时的操作就是使指针与文件“脱钩”。正常关闭时fclose函数返回0值,关闭有误时返回非0值。
三、 文件的读写 1、 fgetc函数 fgetc函数的功能是从以读或读写方式打开的文件中读入一个字符。调用格式: ch=fgetc(fp); ch是要读入的字符;fp为指向文件的文件类型指针。 2、 fputc函数 fputc函数的功能是将一个字符写入以写方式打开的磁盘文件。调用格式: fputc(ch , fp); ch是要输出的字符;fp为指向文件的文件类型指针。 EOF为标准文件的结束标志。在流式文件中,文件结束标志为feof。当fp指向的文件遇到文件结束标志时,feof(fp)=1,否则为0。
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 中。
4、 fprintf和 fscanf 函数 调用格式:fprintf(文件指针, 格式字符串, 输出项表); fscanf(文件指针, 格式字符串, 输入项表);fprintf 和fscanf 函数与printf 和scanf 函数的不同之处是:前者的对象为磁盘文件,而后者的对象为终端。 5、 putw和 getw函数 调用格式: putw(i, fp); /将整型量i输出到fp指向的文件 / i=getw(fp);/从fp指向的文件中读入一个 并赋给整型变量i /
6、 fgets 和 fputs函数 fgets函数的调用格式: fgets(str, n, fp); 从fp指向的文件中读入n–1个字符并放到字符数组str中。该函数的返回值为str的首地址。 fputs函数的调用格式: fputs(str,fp); 将一个字符串输出到fp指向的文件中。这里的str可以是字符串常量、字符串数组名或字符型指针。输出成功,函数值为0,失败时为非0。
例10.1 将一个磁盘文件中的信息复制到另一个磁盘文件中。 用带参数的main函数编写。
7、 读写其它类型的数据 ANSI C 标准的 fread 和 fwrite 函数可以读写任何类型的数据。当用户使用的系统未提供这两个函数时,可以定义所需的函数。如以二进制方式写入一个实数 num 至 fp 指向之文件的函数可以定义如下: putfloat(num, fp) float num; FILE *fp; {char *s; int count; s=# for (count=0; count<4; count++) putc(s[count], fp); }
四、 文件的定位 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); }
2、 fseek函数与文件的随机读写 C的流式文件既可以顺序读写也可以随机读写。 fseek的调用格式: fseek( fp, 位移量, 起始点); 其中:fp为指向文件的指针; 起始点 代码 ANSI C标准的指定名 文件开头 0 SEEK_SET 文件当前位置 1 SEEK_CUR 文件末尾 2 SEEK_END 位移量是以“起始点”为基点向前移动的字节数。ANSI C规定在位移量的末尾加上字母L表示long型,以便在读写大于64K的文件时不致出错。例如:
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,表示出错。
五、 出错的检查 1、 ferror函数 调用格式: ferror(fp); 该函数用来检查各种输入输出函数(如fputc、fgetc、fread、fwrite等)的操作是否有错。若有错,函数的返回值为非0 ,若无错,函数的返回值为0。 2、 clearerr函数 调用格式: clearerr(fp); 调用该函数后,使文件错误标志和文件结束标志及ferror(fp)之值均变为0。
六、 非缓冲文件系统 非缓冲文件系统不属于ANSI C标准的范围,但了解它对于阅读非ANSI C标准程序时不致感到困难。 缓冲文件系统称为高级磁盘I/O系统,它通过指针访问文件。非缓冲文件系统称为低级磁盘I/O系统,它不是通过指针访问文件,而是用一个整数代表一个文件。这个正整数称为“文件号”。 C编译系统允许同时最多打开10个文件,且按文件打开的先后顺序自动将文件号定为1~10。
1、 open函数 调用格式: open(文件名, 打开方式); 该函数用来打开一个非缓冲文件。 其中: 打开方式 作用 0 只读 1 只写 2 读/写 若打开成功,该函数返回一个正整数(文件号),否则返回–1。 2、 close函数 调用格式: close(fd); 关闭由正整数fd代表的非缓冲文件。 若关闭成功,该函数返回值为0 ,否则返回值为–1。
3、 reat函数 Turbo C不允许用open函数建立新文件,而提供一个 creat 函数用来建立新文件。调用格式: creat(文件名, 打开方式); 若建立成功,该函数返回一个正整数(文件号),否则返回–1。 4、 read 函数 调用格式: read(fd, buf, count); read函数的作用是从正整数fd代表的非缓冲文件中读出count个字节的信息到buf指向的缓冲区中。读出成功,read函数返回值为读出的字节数,遇文件结束,read函数返回值为0,否则为–1。
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字节 /
本章习题 P259 10.37 10.38 本