fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp); #include <stdio.h> #include <math.h> #define len(x1,y1,x2,y2) sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) void main() { FILE *fp; int i,j; double min,d; double x[10]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65}; double y[10]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33}; min=len(x[0],y[0],x[1],y[1]); /****考生在以下空白处写入执行语句 ******/ /****考生在以上空白处写入执行语句 ******/ printf("%f\n",min); fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp); } 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
三、相关知识 1. 文件的概念 文件的分类: 所谓“文件”是指记录在外部介质上的数据的有序集合。 根据数据的组织形式(编码方式)分为文本文件和二进制文件两类。 文本文件中的每一个字节存放一个ASCII码,代表一个字符; 二进制文件则是将数据按内存中的原样(二进制形式)存放在磁盘上。 例如有一个十进制整数54321,它在内存中占两个字节,如图,如果将它输出到文本文件则占5个字节,输出到二进制文件占2个字节 二进制文件占存储空间较小,而文本文件更直观 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
2、文件类型指针 文件指针: 由于通常文件中的数据很多, 所以在读写时应该指明是对哪些数据进行操作。在流式文件中采用的方法是设立一个存放文件读写位置的变量, 称为文件指针。在开始对某文件进行操作时将文件指针的值设置为0,表示读写操作应从文件首部开始执行; 每次读、写之后, 自动将文件指针的值加上本次读、写的字节数, 作为下次读写的位置。 typedef struct { int level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold; /* Ungetc char if no buffer */ int bsize; /* Buffer size */ unsigned char *buffer; /* Data transfer buffer */ unsigned char *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ } FILE; FILE f[5]; FILE *fp; FILE *指针变量标识符; 例如:FILE *p; 习惯上笼统地把p称为指向一个文件的指针。 在进行读写操作之前要先打开文件,使用完毕要关闭文件。 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
3、文件的打开与关闭 (1) fopen()函数 fopen()函数的原型为: 文件名,可以包含路径 (1) fopen()函数 打开文件的方式 fopen()函数的原型为: FILE *fopen(char *filename,char *mode); 其中mode参数,可取下列符号: r 读方式 w 写创建方式 a 写追加方式 + 为位于r、w、a之后,表示对于读写规定的补充。 r+ 表示以读、写方式打开一个已经存在的文件 w+ 表示建立一个新文件用于读和写; a+ 表示以读、写方式打开一个已经存在的文件。 b 按二进制方式打开文件。该符号要加在前面的读写方式说明之后。所谓按二进制方式打开文件,即在读、时将文件中的数据作为字节流, 不作任何加工。 t 按文本文件方式打开文件。文本文件可以看成是字符流, 并且以“行”为逻辑单位。文本文件的特点是每行有一个行结束标志,由两个字符构成: 回车符和换行符。 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
在使用fopen()函数时一定要将其返回值存放在一个指向FILE的指针变量中,因为此后对该文件的操作都要通过这个指针变量。 如果文件打开成功, 返回该区域的首地址。 如果文件打开失败, 返回空指针值NULL。 在使用fopen()函数时一定要将其返回值存放在一个指向FILE的指针变量中,因为此后对该文件的操作都要通过这个指针变量。 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
fp = fopen("MYDATA.DAT","rb"); FILE *fp; fp = fopen("MYDATA.DAT","rb"); 以二进制读的方式打开当前目录下的MYDATA.DAT文件。如果该文件不存在, 则fp的值为NULL; fp = fopen("C:\\USER\\README.TXT","rt"); 以读文本文件方式打开指定路径下的文件。注意路径字符串中的'\\'是转义字符,表示一个反斜杠; fp = fopen("MYDATA.DAT","w+b"); 在当前目录下建立一个可读可写的二进制文件。 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
其原型为 int fclose(FILE *fp); 其中参数: fp即用fopen()函数打开文件时返回的文件控制块的地址。如果文件关闭成功,该函数返回0, 否则返回文件结束符EOF。 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
(2)fclose()函数 #include <stdio.h> void main() { FILE *p; p=fopen("11.dat","r"); if(p==NULL) printf("打不开!\n"); exit(0); } fclose(p); 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
4、文件的读写 fprintf()函数和fscanf()函数 调用格式: fscanf(文件指针,格式字符串,输入表列) 例如: fscantf(p,”%d,%f”,&a,&b); fprintf(p,”%d,%f”,a,b); 从p指针所指向的文件中把数据以%d和%f的格式分别读(输入)到变量a和b中 把变量a和b中的值分别以%d和%f的格式写入(输出)到p指针所指向的文件中 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
#include "stdio.h" main() {int a[10],i,b[10]; FILE *fp; fp=fopen("aaa.txt","w"); for(i=0;i<10;i++) scanf("%d",&a[i]); fprintf(fp,"%5d",a[i]); fclose(fp); fp=fopen("aaa.txt","r"); fscanf(fp,"%d",&b[i]); printf("%3d",b[i]); } 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
2. fread()函数、fwrite()函数 将一组数据,如一个数组元素,一个结构变量的值等一次性读写,其输入输出函数是二进制形式输入输出的函数,在输入输出中不必进行数据的转换,输入输出速度相对较快。 读写数据块函数调用的一般形式为: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 说明: buffer:对于fread()来说,指的是读入数据的存放地址; 对于fwrite来说,是要输出数据的地址。 Size: 读写数据时,每笔数据的大小 count: 读写数据的笔数 fp : 文件指针 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
fwrite(pt,sizeof(int),10,fp); fclose(fp); fp=fopen("aaa.txt","rb"); #include "stdio.h" main() {int a[10],i,b[10]; FILE *fp; fp=fopen("aaa.txt","w"); for(i=0;i<10;i++) scanf("%d",&a[i]); fprintf(fp,"%5d",a[i]); fclose(fp); fp=fopen("aaa.txt","r"); fscanf(fp,"%d",&b[i]); printf("%3d",b[i]); } #include "stdio.h" main() {int a[10],i,b[10],*pt=a; FILE *fp; fp=fopen("aaa.txt","wb"); for(i=0;i<10;i++) scanf("%d",&a[i]); fwrite(pt,sizeof(int),10,fp); fclose(fp); fp=fopen("aaa.txt","rb"); pt=b; fread(pt,sizeof(int),10,fp); printf("%3d",b[i]); } 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
2. fread()函数、fwrite()函数 for(i=0;i<10;i++,pp++) fscanf(fp,"%s%d%d%d%f",pp->name,&pp->math, &pp->englist,&pp->chinese,&pp->avg); fread(pp,sizeof(struct stu),10,fp); for(i=0;i<10;i++,p++) fprintf(fp,"%s %d %d %d %.1f\n",pp->name, pp->math,pp->englist,pp->chinese,pp->avg); fwrite(pp,sizeof(struct stu),10,fp); 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
#include <stdio.h> #include <math.h> #define len(x1,y1,x2,y2) sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) void main() { FILE *fp; int i,j; double min,d; double x[10]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65}; double y[10]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33}; min=len(x[0],y[0],x[1],y[1]); /****考生在以下空白处写入执行语句 ******/ for(i=0;i<9;i++) for(j=i;j<9;j++) { d=len(x[i],y[i],x[j+1],y[j+1]); if(min>d) min=d; } /****考生在以上空白处写入执行语句 ******/ printf("%f\n",min); fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp); 浙江长征职业技术学院—计算机与信息技术系—相方莉制作
6.3 项目分析与实现 1. 通讯录中记录的定义 我们可以定义一个person结构体来表示记录的内容。 2. 定义addPerson(Person * one)函数 addPerson(Person * one)函数是将参数中传递来的指向Person 类型的数据保存到 personArray[i]数组中的某个元素中。 3. 定义append()函数 append()函数是让用户输入需要添加的记录的信息,并通过调用addPerson(Person * one)函数把记录添加到personArray[i]数组中的某个元素中。 4. 定义saveContact()函数 saveContact()函数将记录真正添加到记事本中,即保存到文件中。 5. 定义output()函数 output()函数的功能就是把保存在文件中的记录都显示到显示终端中。 浙江长征职业技术学院—计算机与信息技术系—相方莉制作