《《c语言教学资料》PPT课件》由会员分享,可在线阅读,更多相关《《c语言教学资料》PPT课件(47页珍藏版)》请在金锄头文库上搜索。
1、第第8章章 文件文件2 第第8 8章章 文件文件 8.2 文件的打开与关闭文件的打开与关闭 8.3 文件的读写文件的读写 8.4 文件的指针定位文件的指针定位 8.1 文件概述文件概述 8.5 文件的其他检测函数文件的其他检测函数 8.6 特殊的文件名特殊的文件名38.1 8.1 文件概述文件概述v文件是存在计算机存储介质中的一些信息的集合文件是存在计算机存储介质中的一些信息的集合。 v文件是一些记录(文件是一些记录(recordrecord)的集合。记录就是具)的集合。记录就是具有一定关系的信息的集合。有一定关系的信息的集合。v在计算机中,将二进制代码的集合称为信息。在计算机中,将二进制代码
2、的集合称为信息。v文件的种类有很多。例如:文本文件,系统文件,文件的种类有很多。例如:文本文件,系统文件,图形、图像文件,视频文件,音频文件等等。图形、图像文件,视频文件,音频文件等等。v每个文件都有一个名字,称之为文件名。每个文件都有一个名字,称之为文件名。 v文件的名字由两部分组成,文件名和扩展名(也文件的名字由两部分组成,文件名和扩展名(也称为文件后缀)。文件名和扩展名之间用一个称为文件后缀)。文件名和扩展名之间用一个“ “ . ”. ”号分开。扩展名是说明文件的属性。号分开。扩展名是说明文件的属性。48.1 8.1 文件概述文件概述vC C语言在处理信息方面采用的是两种处理方法,一语言
3、在处理信息方面采用的是两种处理方法,一种是将文件看成是种是将文件看成是ASCIIASCII码的集合,在处理这个集码的集合,在处理这个集合时以合时以ASCIIASCII码为单位处理。由码为单位处理。由ASCIIASCII码组成的文码组成的文件,又称为文本文件。另一种是将文件看成是二件,又称为文本文件。另一种是将文件看成是二进制代码的集合。进制代码的集合。 v所谓所谓文本文件文本文件,是把内存中的数据转变成相应的,是把内存中的数据转变成相应的ASCIIASCII码值码值形式,然后存放在磁盘上。因此,每个形式,然后存放在磁盘上。因此,每个字节存放一个字符的字节存放一个字符的ASCIIASCII码值。
4、码值。v所谓所谓二进制文件二进制文件,是把内存中的数据按其在内存,是把内存中的数据按其在内存中的存储形式原样存放到磁盘上去中的存储形式原样存放到磁盘上去58.1 8.1 文件概述文件概述00110011 00110010 00110111 00110110 0011011100110011 00110010 00110111 00110110 00110111文本文件文本文件文本文件文本文件1111 11111111 11110 0111 1111111 1111short int short int 数据数据数据数据327673276733 22 77 66 77 3276732767的各字
5、符的的各字符的的各字符的的各字符的ASCIIASCII码存放形式码存放形式码存放形式码存放形式0111 1111 1111 11110111 1111 1111 1111二进制文件二进制文件二进制文件二进制文件3276732767的二进制存放形式的二进制存放形式的二进制存放形式的二进制存放形式内存存放形式内存存放形式内存存放形式内存存放形式68.1 8.1 文件概述文件概述v数据按文本形式存储在磁盘上,占用的存储空间数据按文本形式存储在磁盘上,占用的存储空间多,存储时要花费转换时间。但以这种形式存储,多,存储时要花费转换时间。但以这种形式存储,一个字节代表一个字符,便于对字符进行逐个处一个字节
6、代表一个字符,便于对字符进行逐个处理,也便于输出显示理,也便于输出显示 v数据按二进制形式存储在磁盘上时,无须花费转数据按二进制形式存储在磁盘上时,无须花费转换时间,占用空间少。但字节不与字符对应,因换时间,占用空间少。但字节不与字符对应,因此不能直接输出显示此不能直接输出显示78.1 8.1 文件概述文件概述v缓冲文件系统缓冲文件系统v输出时,先将数据送到内存缓冲区,缓冲区装满后,才将输出时,先将数据送到内存缓冲区,缓冲区装满后,才将整个缓冲区的内容一次写入磁盘整个缓冲区的内容一次写入磁盘v输入时,先把磁盘中的一块数据读入到内存缓冲区,然后输入时,先把磁盘中的一块数据读入到内存缓冲区,然后再
7、从缓冲区中把需要的数据挑出来,送到程序数据区中再从缓冲区中把需要的数据挑出来,送到程序数据区中磁盘磁盘输入输入输出输出输入文件缓冲区输入文件缓冲区输出文件缓冲区输出文件缓冲区输出输出输入输入程序数据区程序数据区内存内存88.2 8.2 文件的打开与关闭文件的打开与关闭vC C语言执行程序在文件处理上有两种方式:语言执行程序在文件处理上有两种方式:v一种是借助操作系统的外壳功能完成一种是借助操作系统的外壳功能完成C C程序在运行程序在运行的过程中,数据的输入和输出,方式简单,条件的过程中,数据的输入和输出,方式简单,条件比较苛刻。比较苛刻。 。v另一种方式是完全借助另一种方式是完全借助C C语言
8、的一些文件处理函数语言的一些文件处理函数来完成来完成C C语言程序运行过程中的数据读入和输出,语言程序运行过程中的数据读入和输出,比较复杂,但功能强大。比较复杂,但功能强大。v1 1利用操作系统命令打开输入和输出文件。利用操作系统命令打开输入和输出文件。v具有很大的局限性,比如:读取数据只能从头开具有很大的局限性,比如:读取数据只能从头开始读取,不可剪裁读取数据,也不可对数据回读,始读取,不可剪裁读取数据,也不可对数据回读,输入和输出的数据文件只能是文本文件等。(略)输入和输出的数据文件只能是文本文件等。(略)98.2 8.2 文件的打开与关闭文件的打开与关闭v8.2.0.2 8.2.0.2
9、利用函数处理文件利用函数处理文件v在缓冲文件系统中,对每个正在使用的文件都自动分配一在缓冲文件系统中,对每个正在使用的文件都自动分配一个个FILEFILE类型的结构体变量,用于存放文件的有关信息,如类型的结构体变量,用于存放文件的有关信息,如文件号、文件状态、缓冲区地址和大小等文件号、文件状态、缓冲区地址和大小等typedef struct int level; /*缓冲区缓冲区“满满”或或“空空”的程度的程度*/ unsigned flags; /*文件状态标志文件状态标志*/ char fd; /*文件描述符文件描述符*/ unsigned char hold; /*如无缓冲区不读取字符如
10、无缓冲区不读取字符*/ int bsize; /*缓冲区大小缓冲区大小*/ unsigned char *buffer; /*数据缓冲区位置数据缓冲区位置*/ unsigned char *curp; /*文件定位指针文件定位指针*/ unsigned istemp; /*临时文件指示器临时文件指示器*/ short token; /*用于有效性检查用于有效性检查*/FILE; 108.2 8.2 文件的打开与关闭文件的打开与关闭vC语言对于每一个要操作的文件,都必须定义一个语言对于每一个要操作的文件,都必须定义一个指针变量,指向该文件结构体变量,这个指针称指针变量,指向该文件结构体变量,这个
11、指针称为文件指针为文件指针FILE *指指针变量量标识符;符;v打开文件操作:打开文件操作: FILE *fp;FILE *fp; fp=fopen(fp=fopen(文件名称,使用文件方式文件名称,使用文件方式););v关闭文件操作:关闭文件操作: fclose(fp);fclose(fp);11C C文件操作常用函数文件操作常用函数fopen 打开文件打开文件1fclose 关闭文件关闭文件2fgets 读字符串读字符串3fputs 写字符串写字符串4fgetc 读字符读字符5fputc 写字符写字符6feof 指针是否到尾指针是否到尾7fread 读数据块读数据块8fwrite 写数据块
12、写数据块9fscanf 格式读数据格式读数据10fprintf 格式写数据格式写数据11fseek 指针重定位指针重定位12rewind 指针移到头指针移到头13ftell 返回指针位置返回指针位置14128.2 8.2 文件的打开与关闭文件的打开与关闭文件文件类类型型使用方式使用方式意意义义备备注注文本文本文件文件”r”只只读读:打开一个文本文件,只允:打开一个文本文件,只允许读许读数据数据旧文件旧文件”w”只写:打开或建立一个文本文件,只允只写:打开或建立一个文本文件,只允许许写数据写数据新文件新文件”a”追加:打开一个文本文件,并在文件末尾写数据追加:打开一个文本文件,并在文件末尾写数据
13、旧文件旧文件”r+”读读写:打开一个文本文件,允写:打开一个文本文件,允许读许读和写和写旧文件旧文件”w+”读读写:打开或建立一个文本文件,允写:打开或建立一个文本文件,允许读许读写写新文件新文件”a+”读读写:打开一个文本文件,允写:打开一个文本文件,允许读许读,或在文件末追加数据,或在文件末追加数据旧文件旧文件二二进进制制文件文件”rb”只只读读:打开一个二:打开一个二进进制文件,只允制文件,只允许读许读数据数据旧文件旧文件”wb”只写:打开或建立一个二只写:打开或建立一个二进进制文件,只允制文件,只允许许写数据写数据新文件新文件”ab”追加:打开一个二追加:打开一个二进进制文件,并在文件
14、末尾写数据制文件,并在文件末尾写数据旧文件旧文件”rb+”读读写:打开一个二写:打开一个二进进制文件,允制文件,允许读许读和写和写旧文件旧文件”wb+”读读写:打开或建立一个二写:打开或建立一个二进进制文件,允制文件,允许读许读和写和写新文件新文件”ab+”读读写:打开一个二写:打开一个二进进制文件,允制文件,允许读许读,或在文件末追加数据,或在文件末追加数据旧文件旧文件138.2 8.2 文件的打开与关闭文件的打开与关闭#include void main() int a16,i,j,t; FILE *fp1,*fp2; fp1=, r); fp2=, w); for(i=0;i16;i+)
15、 fscanf(fp1,%d,&ai); fprintf(fp2,*Input data are*n); for(i=1;i=16;i+) fprintf(fp2,%3d,ai-1); if(i%4=0)fprintf(fp2,n); 【例例8-1】若输若输入下列无序矩阵入下列无序矩阵得到一个排序得到一个排序矩阵:矩阵:148.2 8.2 文件的打开与关闭文件的打开与关闭 for(i=0;i16;i+) for(j=i+1;j16;j+) if(aiaj) t=ai;ai=aj;aj=t; fprintf(fp2,*output data are*n); for(i=1;i=16;i+) fp
16、rintf(fp2,%3d,ai-1); if(i%4=0) fprintf(fp2,n); fclose(fp1); fclose(fp2);158.2 8.2 文件的打开与关闭文件的打开与关闭v我们使用了两个函数一个是我们使用了两个函数一个是fscanffscanf,另一个是,另一个是fprintffprintf。我们在表对比一他们与标准输入输出函。我们在表对比一他们与标准输入输出函数数scanfscanf、printfprintf的区别。的区别。168.2 8.2 文件的打开与关闭文件的打开与关闭v为了使得上述的程序更加完善,确保程序在运行为了使得上述的程序更加完善,确保程序在运行过程中
17、的正确性。这里我们引入一个新的函数过程中的正确性。这里我们引入一个新的函数exit(0)exit(0),这个函数是结束程序的运行。,这个函数是结束程序的运行。 FILE *fp1,*fp2;if(fp1=, r)=NULL) printf(cannot open infilen); exit(0); /不正确退出运行if(fp2= , w)=NULL) printf(cannot open outfilen);exit(0); /不正确退出运行178.3 8.3 文件的读写文件的读写v8.3.0.1 fscanf()8.3.0.1 fscanf()和和fprintf()fprintf()函数函
18、数v在上一小节中我们看到了这个函数的使用,他们在上一小节中我们看到了这个函数的使用,他们的格式是:的格式是: fscanf(fscanf(文件指针,格式字符串,输入列表文件指针,格式字符串,输入列表);); fprintf(fprintf(文件指针,格式字符串,输出列表文件指针,格式字符串,输出列表););v在他们的格式中,除了文件指针,其他的格式和在他们的格式中,除了文件指针,其他的格式和scanfscanf()()和和 printf()printf()函数是一致的。但是在使用中要注函数是一致的。但是在使用中要注意写入的格式和读出的格式有一定的区别。意写入的格式和读出的格式有一定的区别。18
19、8.3 8.3 文件的读写文件的读写#include void main() FILE *fp; int i,k,n; fp=, w); for (i=1;i6;i+) fprintf(fp, %d,i); if(i%3=0) fprintf(fp,n); fclose(fp); fp=, r); fscanf(fp, %d%d,&k,&n); printf(k=%d,n=%dn,k,n); fclose(fp);【例例8-2】分析下列分析下列程序的写入和读出的程序的写入和读出的过程。过程。198.3 8.3 文件的读写文件的读写v8.3.0.2 fputc()8.3.0.2 fputc()和
20、和 fgetc()fgetc()v(1 1)函数的功能就是将字符写入到)函数的功能就是将字符写入到fpfp所指向的文所指向的文件中去。它在语言的头文件件中去。它在语言的头文件中定义的格式为:中定义的格式为:vint fputc(int c,FILE *fp);int fputc(int c,FILE *fp);v调用方式为:调用方式为:vfputc(ch,fpfputc(ch,fp); ;vchch是一个字符变量,也可是字符常量。是一个字符变量,也可是字符常量。fpfp是文件是文件的指针。的指针。v如果输出成功,这个函数返回的值就是这个函数如果输出成功,这个函数返回的值就是这个函数输出的字符,
21、否则,返回输出的字符,否则,返回EOFEOF(也就是(也就是-1-1)。)。20【例例8-3】从键盘输入一段文字,以回车作从键盘输入一段文字,以回车作为结束符,写入到指定的文件中。为结束符,写入到指定的文件中。#include #include void main() FILE *fp; char ch,filename12; printf(Please input filename:); scanf(%s,filename); if(fp= fopen(filename, w)=NULL) printf(cannot open input-file:%sn,filename); exit(0
22、); printf(Please begin input string:n); ch=getchar(); while(ch=getchar()!=n) fputc(ch,fp); fclose(fp);218.3 8.3 文件的读写文件的读写v(2 2)fgetc()fgetc()函数是从一个打开的磁盘文件中读函数是从一个打开的磁盘文件中读取一个字符,它在语言的头文件取一个字符,它在语言的头文件中定义的格中定义的格式为:式为:vint fgetc(*fp);int fgetc(*fp);v调用方式为:调用方式为:vch=fgetc(fp);ch=fgetc(fp);v其中其中chch是一个字
23、符变量。是一个字符变量。fpfp是一个文件的指针。是一个文件的指针。22【例例8-4】输入已存在的输入已存在的.txt文件名,将其内容显示文件名,将其内容显示在计算机屏幕上。在计算机屏幕上。#include #include void main() FILE *fp; char ch,filename12; printf(Please input filename:); scanf(%s,filename); if(fp= fopen(filename, r)=NULL) printf(cannot open input-file:%sn,filename); exit(0); printf(
24、begin output string:n); while(ch=fgetc(fp)!=EOF) putchar(ch); putchar(n); fclose(fp);238.3 8.3 文件的读写文件的读写#include void main(int argc,char *argv) FILE *fp1,*fp2; char ch; if (argc!=3) printf(“Input argument error!”);exit(0); if(fp1=fopen(argv1, “r”)=NULL) printf(“cannot open source-file:%sn”,in_file)
25、; exit(0); if(fp2= fopen(argv2, “w”)=NULL) printf(“cannot open object-file:%sn”,out_file); exit(0); while(ch=fgetc(fp1)!=EOF) fputc(ch,fp2); fclose(fp1); fclose(fp2);【例8-5】完成文件复制248.3 8.3 文件的读写文件的读写v8.3.0.3 fread() 8.3.0.3 fread() 函数和函数和fwrite()fwrite()函数函数v这两函数也是向一个打开的文件内写入和读出数这两函数也是向一个打开的文件内写入和读出数
26、据。但使用方式有所不同。据。但使用方式有所不同。v(1 1)fwrite()fwrite()是将某一个二进制数据写入到磁盘是将某一个二进制数据写入到磁盘文件中。该函数的格式为:文件中。该函数的格式为:vint fwrite(void *buffer,int num_byte,int int fwrite(void *buffer,int num_byte,int count,fp);count,fp);void *buffer void *buffer 数据缓冲区。数据缓冲区。int num_byte int num_byte 所要读取文件的字节数。所要读取文件的字节数。int count i
27、nt count 注明所要读取数据的倍数。注明所要读取数据的倍数。fp fp 文件指针。文件指针。258.3 8.3 文件的读写文件的读写【例例8-68-6】将下列矩阵的数据保存在给定的数据文件中。将下列矩阵的数据保存在给定的数据文件中。 #include #include #include #define COL 4#define ROW 3#define F 1626void main() FILE *fp;float a34=1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1,10.1,11.1,12.1; char w_name10; int i,j; float
28、(*p)4; printf(Please input w_name:); scanf(%s,w_name); if(fp=fopen(w_name,wb)=NULL) printf(Cannot open filen);exit(0); p=a; for (i=0;iROW;i+) fwrite(p+i,F,COL,fp); fclose(fp);278.3 8.3 文件的读写文件的读写v(2 2)fread()fread()是将某一个二进制数据读入到数据是将某一个二进制数据读入到数据缓冲区。该函数的格式为:缓冲区。该函数的格式为:vint fread(void *buffer,int num
29、_byte,int int fread(void *buffer,int num_byte,int count,fp);count,fp);v该函数共有四个参数该函数共有四个参数void *buffer void *buffer 数据缓冲区。数据缓冲区。int num_byte int num_byte 所要读取文件的字节数。所要读取文件的字节数。int coun int coun 注明所要读取数据的倍数。注明所要读取数据的倍数。fp fp 文件指针。文件指针。#include #include #include #define COL 4#define ROW 3【例例8-7】将例中文件中的
30、数据读入到一个数组中。将例中文件中的数据读入到一个数组中。28void main() FILE *fp; float b34=0; /读出用写入的同种方式 char r_name10; int i,j; float (*p)4; printf(Please input r_name:); scanf(%s,r_name); if(fp=fopen(r_name,rb)=NULL) printf(Cannot open filen);exit(0); p=b; for (i=0;iROW;i+) fread(p+i,sizeof(float),COL,fp); /写入的方式相同 fclose(f
31、p); for (i=0;iROW;i+) /显示读出的结果 for (j=0;jCOL;j+) printf(%4g ,bij); printf(n); 298.3 8.3 文件的读写文件的读写v8.3.0.4 8.3.0.4 其他读写函数其他读写函数v(1 1)putw()putw()和和getw()getw()函数函数v这两个函数是将一个整型数写到文件中或者从一这两个函数是将一个整型数写到文件中或者从一个文件中读取一个整数。注意一个整型数占用个文件中读取一个整数。注意一个整型数占用2 2个个字节。但有一个必要条件,它所打开的文件一定字节。但有一个必要条件,它所打开的文件一定是二进制文件格
32、式。它们的使用方式是:是二进制文件格式。它们的使用方式是:vputw(a,fp);putw(a,fp);va=getw(fp);a=getw(fp);v其中其中a a为一个整数,为一个整数,fpfp为文件指针。也可直接将以为文件指针。也可直接将以整数写入到文件中。其格式为:整数写入到文件中。其格式为:vputw(10,fp);putw(10,fp);30【例例8-8】将将015写入到一个文件中,然后从该文件中读出数写入到一个文件中,然后从该文件中读出数据,并用十六进制数格式显示出来。据,并用十六进制数格式显示出来。#include #include void main() FILE *fp;
33、int a,i; if(fp= fopen(data.dat,wb+)=NULL) printf(cannot open input-file: data.dat.n); exit(0); for(a=0;a=15;a+) putw(a,fp); fclose(fp); if(fp= fopen(data.dat,rb+)=NULL) printf(cannot open output-file: data.dat.n); exit(0); for(i=0;i=15;i+) a=getw(fp); printf(%2xn,a); printf(n); fclose(fp); 318.3 8.3
34、 文件的读写文件的读写v(2 2)fgets()fgets()和和fputs()fputs()函数函数v这两个函数是将一个字符串写入到一个文件中,这两个函数是将一个字符串写入到一个文件中,他们的格式为:他们的格式为:vfgets(str,n,fp);fgets(str,n,fp);vfputs(str,fp);fputs(str,fp);vstrstr为字符串数组或者字符串指针。为字符串数组或者字符串指针。n n为读出的字为读出的字符个数,符个数,fpfp为文件指针。这里打开的文件方式没为文件指针。这里打开的文件方式没有明确的要求,可以是文本方式也可以是二进制有明确的要求,可以是文本方式也可以
35、是二进制方式。方式。32【例例8-9】将小写的将小写的26个英文字母写入到指定的文件中。个英文字母写入到指定的文件中。然后读出显示在屏幕上。然后读出显示在屏幕上。#include #include void main() FILE *fp; char *str1=abcdefghijklmnopqrstuvwxyz,str230; int n=26; if(fp= fopen(data.dat,w+)=NULL) printf(cannot open output-file: data.dat.n); exit(0); fputs(str1,fp); fclose(fp); if(fp= fo
36、pen(data.dat,r+)=NULL) printf(cannot open input-file: data.dat.n); exit(0); fgets(str2,n-1,fp); /起始位置为“0”,读取n-1个 printf(str=%sn,str2); fclose(fp); 338.4 8.4 文件的指针定位文件的指针定位vC C语言打开的每个文件,都有一个文件指针牵引,语言打开的每个文件,都有一个文件指针牵引,文件指针是一看不见游标。文件指针是一看不见游标。v当你对文件进行一次读写,该指针都会自动的加当你对文件进行一次读写,该指针都会自动的加“1”“1”,这个对初学者是一个
37、比较难理解的概念。,这个对初学者是一个比较难理解的概念。也是难以运用的一种方式。也是难以运用的一种方式。v但是,我们对文件进行操作时难免需要指针按照但是,我们对文件进行操作时难免需要指针按照我们的意识进行运动。这样我们就要对指针的运我们的意识进行运动。这样我们就要对指针的运行方向,要有具有能控制的方式。行方向,要有具有能控制的方式。 348.4 8.4 文件的指针定位文件的指针定位v8.4.0.1 rewind()8.4.0.1 rewind()函数函数v该函数被称之回绕函数,来源于磁带机的该函数被称之回绕函数,来源于磁带机的“倒带倒带”,早期计算机的外部大型数据存储器是由盘式,早期计算机的外
38、部大型数据存储器是由盘式磁带机完成的,当一盘数据被读取完成,就需要磁带机完成的,当一盘数据被读取完成,就需要将磁带回绕。以便下一次读取数据时使用。在将磁带回绕。以便下一次读取数据时使用。在C C语语言中,将其引申为指针归位,就是将指针指向文言中,将其引申为指针归位,就是将指针指向文件头,无论指针当前在什么位置。件头,无论指针当前在什么位置。v其格式为:其格式为:vrewind(fp);rewind(fp);358.4 8.4 文件的指针定位文件的指针定位#include #includevoid main() FILE *fp; int a,i; if(fp= fopen(data.dat,w
39、b+)=NULL) printf(cannot open input-file: data.dat.n); exit(0); for(a=0;a=15;a+) putw(a,fp); rewind(fp); for(i=0;i=15;i+) a=getw(fp); printf(%2x,a); printf(n); fclose(fp);368.4 8.4 文件的指针定位文件的指针定位v8.4.0.2 fseek()8.4.0.2 fseek()函数函数v该函数可将当前文件指针所指位置再次定位该函数可将当前文件指针所指位置再次定位vfseek(fseek(文件指针,位移量,起始点文件指针,位移
40、量,起始点) )v其函数原型为:其函数原型为:vint fseek(fp,long num_byte,int origin);int fseek(fp,long num_byte,int origin);vfp, fp, 为文件指针。为文件指针。vlong num_byte, long num_byte, 长整形数,位移量。正数表示向长整形数,位移量。正数表示向文件尾的方向移动指针。负表示向文件头的方向文件尾的方向移动指针。负表示向文件头的方向移动指针。移动指针。vint originint origin, “ “0”0”表示从文件头开始。表示从文件头开始。“1”1”表表示从当前位置开始。示从
41、当前位置开始。“2”2”表示文件尾开始。表示文件尾开始。37【例例8-10】将将26个英文小写字母写入到指定的文件中。个英文小写字母写入到指定的文件中。然后,将奇数位置上的字符读出,并打印。然后,将奇数位置上的字符读出,并打印。8.4 8.4 文件的指针定位文件的指针定位#include #include void main() FILE *fp; char *str1=abcdefghijklmnopqrstuvwxyz,ch; int i,n=26; if(fp= fopen(data.dat,w+)=NULL) printf(cannot open output-file: data.d
42、at.n); exit(0); fputs(str1,fp); rewind(fp); for(i=0;i=n-1;i+=2) ch=fgetc(fp); fseek(fp,1,1); printf(%c ,ch); printf(n); fclose(fp);388.4 8.4 文件的指针定位文件的指针定位v8.4.0.3 ftell()8.4.0.3 ftell()函数函数v该函数是报告文件指针的当前位置,一般是一整该函数是报告文件指针的当前位置,一般是一整数的形势报告。该函数的书写格式为:数的形势报告。该函数的书写格式为:v ftell(fp);ftell(fp);vfpfp为文件指针。
43、为文件指针。v如果该函的返回值为如果该函的返回值为-1L-1L则认为表示出错。具体用则认为表示出错。具体用法用例题加以说明。法用例题加以说明。39【例例8-11】将将26个英文小写字母写入到指定的文件中。然个英文小写字母写入到指定的文件中。然后,将其读出,同时显示当前指针的变化。后,将其读出,同时显示当前指针的变化。8.4 8.4 文件的指针定位文件的指针定位void main() FILE *fp;char *str1=abcdefghijklmnopqrstuvwxyz,ch;int j,i,n=26;if(fp= fopen(data.dat,w+)=NULL)printf(cannot
44、 open output-file: data.dat.n); exit(0);fputs(str1,fp);rewind(fp);for(i=0;i=n-1;i+)j=ftell(fp);printf(j=%2d,j);fseek(fp,i,0);ch=fgetc(fp);printf(%c ,ch);if(i+1)%4=0)printf(n); printf(n);fclose(fp); 408.5 8.5 文件的其他检测函数文件的其他检测函数v还有一些关于文件出错处理的函数还有一些关于文件出错处理的函数, ,这些函数一般这些函数一般是给系统管理员编程时使用的。是给系统管理员编程时使用的。
45、v8.5.0.1 feof()8.5.0.1 feof()v该函数的功能是判断函数指针是否已经指向文件该函数的功能是判断函数指针是否已经指向文件尾。往往我们对打开的文件的内容是不清楚的,尾。往往我们对打开的文件的内容是不清楚的,尤其是其长度。所起要想将一个文件的内容全部尤其是其长度。所起要想将一个文件的内容全部处理,只能借助该函数加以完成。该函数原型为:处理,只能借助该函数加以完成。该函数原型为:vint feof(fp);int feof(fp);v其中其中fpfp为文件指针。为文件指针。v当给出一文本文件名称后将其内容显示在屏幕上。当给出一文本文件名称后将其内容显示在屏幕上。 418.5
46、8.5 文件的其他检测函数文件的其他检测函数#include #include void main() FILE *fp; char filename12; printf(Please input filename:); scanf(%s,filename); if(fp= fopen(filename,r+)=NULL) printf(cannot open input-file:%sn,filename); exit(0); while(!feof(fp) printf(%c,fgetc(fp); printf(n); fclose(fp);【例例8-12】当给出一文本文件当给出一文本文件
47、名称后将其内容显示在屏幕上。名称后将其内容显示在屏幕上。428.5 8.5 文件的其他检测函数文件的其他检测函数v8.5.0.2 ferror()8.5.0.2 ferror()v该文件是判断文件指针操作是否有错误,如果出该文件是判断文件指针操作是否有错误,如果出现错误,该文件返回一个非现错误,该文件返回一个非“0”0”值。否则返回值。否则返回“0”0”。可通过判断该函数返回的值,来确定当前。可通过判断该函数返回的值,来确定当前指针操作是否有错误。该函数原型为:指针操作是否有错误。该函数原型为:vint ferror(fp);int ferror(fp);v其中其中fpfp为指针。如何使用该函
48、数,我们用例题加为指针。如何使用该函数,我们用例题加以说明。以说明。438.5 8.5 文件的其他检测函数文件的其他检测函数#include #include void main() FILE *fp;char ch,filename12;printf(Please input filename:);scanf(%s,filename);if(fp= fopen(filename,w)=NULL) printf(cannot open input-file:%sn,filename); exit(0);ch=fgetc(fp);clearerr(fp);if (ferror(fp)!=0) p
49、rintf(read file error!);else printf(read file success!);fclose(fp);printf(n); 【例例8-13】判断如何正确使用读写文件。判断如何正确使用读写文件。448.5 8.5 文件的其他检测函数文件的其他检测函数v8.5.0.3 clearerr()8.5.0.3 clearerr()v该函数的作用是清除掉打开文件和指针操作出现该函数的作用是清除掉打开文件和指针操作出现的错误标记。当该函数被调用,会将的错误标记。当该函数被调用,会将ferror()ferror()和和feoffeof()()的函数值由非的函数值由非“0”“0”
50、的数改变成的数改变成“0”“0”。该函数。该函数的原型为:的原型为:vint clearerr(fp);int clearerr(fp);v其调用过程为:其调用过程为:vclearerr(fp);clearerr(fp);458.5 8.5 文件的其他检测函数文件的其他检测函数v8.5.0.4 remove()8.5.0.4 remove()函数函数v该函数的功能是删除一个文件。其格式为:该函数的功能是删除一个文件。其格式为:vremove(“remove(“文件名称文件名称”););v如果要删除但前目录下的文件名为的文件:如果要删除但前目录下的文件名为的文件:”);”);v如果要删除非当前目
51、录下的文件。要将路径名加如果要删除非当前目录下的文件。要将路径名加入。比如:要删除入。比如:要删除E:01 E:01 文件。文件。remove(“e:01data.dat”);remove(“e:01data.dat”);v这个函数可以将一些中间文件和临时文件删除掉,这个函数可以将一些中间文件和临时文件删除掉,节省磁盘空间。节省磁盘空间。468.5 8.5 文件的其他检测函数文件的其他检测函数v8.5.0.5 system()8.5.0.5 system()函数函数v该函数的功能是调用系统命令和执行一些应用程该函数的功能是调用系统命令和执行一些应用程序。其格式为:序。其格式为:vsystem(“system(“文件名称文件名称”) )v这里的文件名称一定是一个可执行的文件。该文这里的文件名称一定是一个可执行的文件。该文件名称之前也可加入该文件所在地的路径名。例件名称之前也可加入该文件所在地的路径名。例如:在如:在DOSDOS操作系统下查看当前文件夹内容的命令操作系统下查看当前文件夹内容的命令是是DIRDIR。可这样书写。可这样书写。vsystem(“dir”)system(“dir”);v当执行这一函数时,显示当前目录下的所有文件当执行这一函数时,显示当前目录下的所有文件名称和目录名称。名称和目录名称。478.6 8.6 特殊的文件名特殊的文件名v(略)(略)