第七章 文件 7.1 文件的基本概念 7.2 文件类型指针 7.3 文件的打开与关闭 7.4 文件的读/写 7.5 文件的随机读/写 第七章 文件 7.1 文件的基本概念 7.2 文件类型指针 7.3 文件的打开与关闭 7.4 文件的读/写 7.5 文件的随机读/写 7.6 文件检测函数
7.1 文件的基本概念 文件的概念 文件是指存储在外存中数据的集合。 操作系统是以文件为单位对数据进行管理。 7.1 文件的基本概念 文件的概念 文件是指存储在外存中数据的集合。 操作系统是以文件为单位对数据进行管理。 系统默认的标准输入文件是键盘,标准输出文件是显示器。
文件的类型: 根据数据的存储形式,将文件分为ASCII码和二进制文件。ASCII码文件(即文本文件)中的每个字节表示一个字符;二进制文件中的数据与其在内存中的表示形式一致。 数据文件的存取以字节为单位,这种文件被称作流式文件。
7.2 文件类型指针 C程序中,每个被使用文件的相关信息(如文件名、文件状态、文件位置等)都由一个结构体变量保存,该结构体类型由系统已定义好,取名为FILE。在stdio.h文件中有它的定义。 对文件的处理全部由函数来实现。在使用文件之前,首先要定义指向FILE结构体类型的指针变量,保存打开文件的信息。
7.3 文件的打开与关闭 1.文件打开函数fopen( ) 格式为: FILE *fp; fp=fopen(文件名, 文件使用方式); 7.3 文件的打开与关闭 1.文件打开函数fopen( ) 格式为: FILE *fp; fp=fopen(文件名, 文件使用方式); 例: fp=fopen("a1", "r") "r" 方式是以只读方式,打开一个已存在的文件,如果文件不存在则出错,fopen函数将返回一个空指针值NULL。
只写打开或建立一个文本文件,只允许写数据 文件使用 方式 含 义 r 只读打开一个文本文件,只允许读数据 w 只写打开或建立一个文本文件,只允许写数据 a 追加打开一个文本文件,并在文件末尾写数据 rb 只读打开一个二进制文件,只允许读数据 wb 只写打开或建立一个二进制文件,只允许写数据 ab 追加打开一个二进制文件,并在文件末尾写数据 r+ 读写打开一个文本文件,允许读和写 w+ 读写打开或建立一个文本文件,允许读和写 a+ 读写打开一个文本文件,允许读,或在文件末追加数据 rb+ 读写打开一个二进制文件,允许读和写 wb+ 读写打开或建立一个二进制文件,允许读和写 ab+ 读写打开一个二进制文件,允许读,或在文件末追加数据
2.文件关闭函数fclose( ) 格式: fclose(文件指针) 例:fclose(fp);
7.4.1 字符读写函数fgetc( )和fputc( ) 7.4 文件的读写 7.4.1 字符读写函数fgetc( )和fputc( ) 1.读字符函数fgetc( ) 功能:从指定的文件中读一个字符。 格式:字符变量=fgetc(文件指针); 例:ch=fgetc(fp); 此语句是从fp指向的文件中读取一个字符并存入ch中。 说明: 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。 使用fgetc函数顺序读字符时,若遇到文件结束符,对于文本文件,该函数返回EOF(-1)值。而对于文本文件和二进制文件, 还可以通过feof函数来测试。当遇到文件结束时,feof返回值为1;否则返回0。
2. 写字符函数fputc( ) 功能:将一个字符写入指定的文件中。 格式:fputc(字符,文件指针); 例:fputc('a', fp); 将字符'a'写入fp所指向的文件中。
7.4.2 字符串读写函数fgets( )和fputs( ) 功能:从指定的文件中读一个字符串到字符数组中。 格式: fgets(字符数组名,n,文件指针); 其中,n是一个正整数。表示从文件中读出的字符个数不超过n-1个,并自动在读出的字符串尾部加上结束标志‘\0’。 例如:fgets(str,n,fp); 此语句从fp所指的文件中读出n-1个字符送入字符数组str中。
2. 写字符串函数fputs( ) 功能:向指定的文件写入一个字符串。 格式:fputs(字符串,文件指针); 例如:fputs("abcd",fp); 此语句是把字符串“abcd”写入fp所指的文件中。
7.4.3 数据块读写函数fread( )和fwrite( ) 读数据块函数的调用格式: fread(buffer, size, count, fp); 写数据块函数的调用格式: fwrite(buffer, size, count, fp); 其中,buffer是一个指针。在fread函数中,它表示存放读入数据块的首地址。在fwrite函数中,它表示存放要写数据块的首地址。size表示数据块的大小(即字节数)。count 表示要读写的数据块块数。fp表示文件指针。 例如:fread(fa, 4, 5, fp); 从fp所指的文件中,每4个字节(一个实数)存入实型数组fa的一个元素,本次共读取5个实数存入数组fa中。
7.4.4 格式化读写函数fscanf( )和fprintf( ) 调用格式: fscanf(文件指针,格式控制串,输入表列); fprintf(文件指针,格式控制串,输出表列); 例如:fscanf(fp,"%d,%s", &i, s); 从fp指针所指的文件的当前位置读取一个整数和一个字符串。 fprintf(fp,"%6.2f,%c", j, ch); 将变量j和ch分别以实型和字符型存入fp指针所指的文件中(两个数据之间用逗号分隔)。
对文件操作必须先打开文件,对文件操作后关闭文件。文件操作顺序可以是顺序读/写,也可以是随机读/写。 7.5 文件的随机读/写 对文件操作必须先打开文件,对文件操作后关闭文件。文件操作顺序可以是顺序读/写,也可以是随机读/写。 7.5.1 rewind函数 rewind函数功能是使文件内部的位置指针移到文件首。 调用格式为:rewind(文件指针);
fseek函数用来移动文件内部位置指针。 调用格式为: fseek(文件指针,位移量,起始点); 默认标识符 数字表示 文件首 SEEK_SET 当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 例如:fseek(fp, -10L, 2); 将文件位置指针从文件末尾向文件头方向移10个字节
7.5.3 ftell函数 ftell函数的功能是得到流式文件中的当前读写位置,用相对于文件首的位移量来表示。 其调用格式:ftell(文件指针); 该函数具有long型返回值,如果其返回值为-1L,则表示对当前文件的操作有误。例如: if(ftell(fp)==-1L) printf("File error!\n");
7.6 文件检测函数 7.6.1文件结束标志检测函数feof 函数调用格式:feof(文件指针); 7.6 文件检测函数 7.6.1文件结束标志检测函数feof 函数调用格式:feof(文件指针); 功能:判断当前文件的读写指针是否指向文件结束符。如果指向文件尾,则返回值为1;否则为0。 7.6.2读写文件出错检测函数ferror 函数调用格式:ferror(文件指针); 功能:检查文件在使用各种数据读写函数进行读写时是否出错。如果ferror返回值为0,表示未出错;否则表示有错。 在执行fopen函数时,ferror函数的初始值自动置为0。
例:统计二进制文件letter.dat中的字符个数。 #include<stdio.h> #include<stdlib.h> void main( ) { FILE *fp; long count=0; if((fp=fopen(“letter.dat”, “rb”))==NULL) { printf(“Cannot open the file.\n”); exit(0); } while(!feof(fp)) { fgetc(fp); count++; printf(“count=%ld\n”, count-1); fclose(fp);