1、第10章 文件 101 C文件概述 1011 概念存储在外部介质上数据的集合,是操作系统管理数据的单位。 外部介质: 磁盘 (输入、输出都可)终端键盘 输入文件显示器打印机 输出文件,1012 数据流C语言把文件看作数据流。 字节的序列。字节流或二进制流。 ASCII文件与二进制文件。文件的存取单位:字节。流式文件:把文件中的数据看成由字节组成的数据流,而不认为文件是 由记录构成的。,1013 缓冲文件系统与非缓冲文件系统 缓冲文件系统:系统自动为文件开辟存放文件的缓冲区,用于存放文件的数据。缓冲区大小一般为512字节,是与外存进行数据交换的数据单位。又称高级(高层)输入输出系统。非缓冲文件系
2、统 :系统自动不提供缓冲区,需要编写程序设定缓冲区。又称低级(低层)输入输出系统。书上图示。,10.2 文件类型指针要想对文件进行操作,首先必须为不同的文件定义不同的文件指针,然后通过这些指针操作文件。定义方式 FILE *fp; 实际上,FILE是一种结构类型,用来描述文件有关信息。定义了文件指针以后,意味着:开辟一个FILE结构的空间,用指针fp指向它。,10.3 文件的打开与关闭 10.3.1 文件的打开C语言的文件操作都用函数实现。fopen()函数用来打开文件。fp=fopen(文件名,使用文件方式);fp为已定义的文件指针。 例: FILE *fp;fp=fopen(“A”,”r”
3、);fp 指向要操作的文件。fp与A文件具有对应的关系。,打开文件需要的信息 : 1、打开哪个文件2、打开文件的方式3、使用哪个文件指针打开文件的文件名是字符串常量或变量。使用文件方式一般也要带双引号。fopen返回一个指针,应该不为空, 为空表示文件打开失败。,正确打开文件的方式:if (fp=fopen(“A”,”r”)=NULL)printf(“cannot open this file n”);exit(0);else 文件处理;文件的使用方式 : 书上,10.3.2 文件的关闭文件操作结束以后,需要释放文件指针,使文件指针与文件“脱钩”,关闭以后,不能再对该文件进行操作。fclose
4、函数fclose(文件指针)例如:fclose(fp);文件操作的顺序:打开处理关闭保证文件操作的正常执行。与缓冲区有关。,10.4 文件的读写 10.4.1 fputc函数与fgetc函数 1、fputc()调用方法:fputc(ch,fp)功能:将ch的内容输出到fp所指的文件中,ch是单个字符。#define putchar(c) fputc(c,stdout) 2、fgetc() 调用方法:fgetc(fp)功能:从fp所指的文件中读单个字符作为返回值。,例10.1 将键盘输入存储到文件中。 #include “stdio.h“ #include “alloc.h“ #include
5、“process.h“ void write_to() FILE *fp;char ch;fp=fopen(“we“,“wb“);if (fp=NULL) printf(“cannot open file“);exit(0);ch=getchar();while (ch!=#) fputc(ch,fp);ch=getchar(); fclose(fp); ,void main() write_to(); 用fopen打开文件时可以使用字符串变量指定文件和读写方式 .char filename=“we“;char mode=“wb“;FILE *fp;char ch;fp=fopen(filen
6、ame,mode); .,例10.2 将刚才存储的文件在屏幕上显示。 void read_in() FILE *fp; char ch;fp=fopen(“we“,“rb“);if (fp=NULL) printf(“cannot open file“);exit(0);while (!feof(fp) ch=fgetc(fp);putchar(ch); ,10.4.2 fprintf函数与fscanf函数与printf scanf的使用格式很相似。 fprintf(文件指针,格式字符串,输出表列); fscanf(文件指针,格式字符串,输入表列); 例10.4 创建文件TEST,从键盘上读进
7、两个整数。,#include “stdio.h“ #include “process.h“ void main() FILE *f;int i,j;if (f=fopen(“c:TEST“,“w“)!=NULL) scanf(“%d%d“, ,例10.5:将文件TEST中将刚刚存储的两个整数显示在屏幕上。 #include “stdio.h“ #include “process.h“ void main() FILE *f;int i,j;if (f=fopen(“c:TEST“,“r“)!=NULL) fscanf(f,“%d%d“, ,10.4.3 fread函数与fwrite函数 数据块
8、的读入和写出。 顺序文件。 fread(datapointer,size,count,fp) fwrite(datapointer,size,count,fp)其中,datapointer是读写存取数据的地址。读入数据时,把要读入的数据存放在它指定的区域。输出数据时,从该地址指定的区域开始输出。 size * count 读写的总字节数。 fp 文件指针。 count 正确调用后的返回值,例10.6:输出10个整型数到文件中。 #include “stdio.h“ #include “process.h“ void main() static int a10=0,1,2,3,4,5,6,7,8
9、,9; FILE *f; if (f=fopen(“TT“,“wb“)=NULL)exit(0); else if (fwrite(a,sizeof(int),10,f)!=10)printf(“file write errorn“); fclose(f); 可否一个整数一个整数的写?如何写?,void main() int i;static int a10=0,1,2,14,15,1,6,7,8,9;FILE *f;if (f=fopen(”TT“,“wb“)=NULL)exit(0);else for (i=0;i10;i+)if ( fwrite( ,例10.7在屏幕上显示TT文件中的十
10、个整数。 #include “stdio.h“ #include “process.h“ void main() int b10;FILE *f;int i;if (f=fopen(“c:TT“,“rb“)=NULL)exit(0);else if (fread(b,sizeof(int),10,f)!=10)printf(“file read errorn“);for (i=0;i=9;i+)printf(“%d “, bi);fclose(f); ,例10.8 对文件进行排序。 void sort() int b10; FILE *f;int i,k,m,n,l,temp;if (f=fo
11、pen(“tt“,“rb“)=NULL)exit(0);else if (fread(b,sizeof(int),10,f)!=10)printf(“file read errorn“);fclose(f);for (m=0;m9;m+) k=m;for (n=m+1;n10;n+)if (bnbk) k=n;if (k!=m) temp=bk;bk=bm;bm=temp;,if (f=fopen(“tt“,“wb“)=NULL)exit(0);else for (i=0;i10;i+)if ( fwrite(b+i,sizeof(int),1,f)!=1)printf(“file write
12、 errorn“);printf(“nsucced!n“);fclose(f); ,10.5 文件的定位随机文件。 10.5.1 rewind函数格式:rewind(fp);功能:文件的位置指针重新返回文件的开头。,10.5.2 fseek函数功能:移动文件的位置指针。格式:fseek(fp,位移量,起始点);0 :文件开始1 :当前位置2 :文件末尾位移量:从起始点开始移动的字节数。整数向前移动;负数向后移动。,修改外排序算法 void sort() int b10;FILE *f;int i,k,m,n,l,temp;if (f=fopen(“tt“,“rb+“)=NULL)exit(0);else if (fread(b,sizeof(int),10,f)!=10)printf(“file read errorn“);for (m=0;m9;m+) k=m;for (n=m+1;n10;n+)if (bnbk) k=n;if (k!=m) temp=bk;bk=bm;bm=temp;,rewind(f);for (i=0;i10;i+)if ( fwrite( ,