附录1
东莞理工学院城市学院
《数据结构》课程设计报告
题 目: 班 级: 2012级软件工程 班 小组成员: 指导教师: 彭义春 老师 时 间: 2013.12. —2013.12. 地 点:
东莞理工学院城市学院计算机与信息科学系制
2013年 12 月
附录2:关于文件操作
C语言的文件操作主要有三个步骤: (一) 打开文件
打开文件使用函数fopen(“文件名”,”方式”);
其中,”文件名”可以是字符串变量表示,它告诉系统要打开的文件的文件名,一般应为文件全名。
“方式”为打开该文件欲进行什么操作,如“读”/r,或者“写”/w等。 该函数执行后返回所打开文件缓冲区指针。所以,一般需要: 先定义一个文件类型的指针,如:FILE *fp; 然后,fp=fopen(“D:\\mydata.dat”,”w”); 若打开不成功,则指针值为NULL。 (二) 文件读写
读/写文件主要有如下几组函数:
(1) fprintf(fp,”格式描述串”,<输出列表>);----写数据到文件 fscanf(fp,”格式描述串”,<变量列表>);----从文件读数据 (2) fwrite(”数据缓冲区地址”,”记录字节数”,”记录数”,fp);----写记录数据到文件(二进
制)
fread(”数据缓冲区地址”,”记录字节数”,”记录数”,fp);----从二进制文件中读数据 (3) fputc();和fgetc(); 读/写数据为字符类型。 当把文件中的数据读到内存后,可以对其中的数据进行所需要的操作(如通过赋值语句等对先观数据进行修改等)。这阶段看作是对文件数据进行实质性操作的阶段。 (三) 关闭文件
关闭文件用函数:close(fp);
其中,fp为你所要关闭的文件指针,当一个程序中对多个文件进行操作时,特别注意不要关闭不希望关闭的文件。
此外,数据存储到文件中时,数据的存储格式也有不同,即通常所说的“文本文件”和“二进制文件”。
下面给出一些示例: 例一. 将0-14这15个整数存入文件stud2.dat #include
/*以文本方式存储15个整数*/ void save_dat() {FILE *fp; int i;
if((fp=fopen(\ { printf(\ return; }
for(i=0;i printf(\ fclose(fp); } main() { save_dat(); } 当用记事本打开数据文件stud2.dat,可以看到0-14这15个数以字符(文本)格式存储在文件中,并且,这15个数据是紧挨着存储的--当再用fscanf(“%d”,&i)从该文件中读取这 些数据时、将不能正确读取、故需要注意数据存储格式。--可以修改fprintf()为: for(i=0;i 这样,每个整数占6位宽度,存储时各数据之间就留有空格,再用fscanf(“%d”,&i)读取时,每个空格将成为数据的分界符;但是,如果将fscanf(“%d”,&i)修改为 fscanf(“%d,”,&i)/*多一个逗号*/ 那么,在读取数据时,将按格式描述串中约定的逗号作各个数据之间的分隔符,此时,需要将存储文件是的fprintf()对应地修改为: for(i=0;i 用该语句存储数据的结果(从记事本打开看),可以看到每个数据之间也存储了逗号(最后一个数据之后也有逗号)。 当然,这15个整数也可以以二进制格式存储到文件中,如下程序即是: #include /*用二进制方式存储0-14*/ void save_dat() {FILE *fp; int i; if((fp=fopen(\ { printf(\ return; } for(i=0;i fwrite(&i,sizeof(int),1,fp); printf(\ fclose(fp); } main() { save_dat(); } 运行该程序并用记事本打开文件stud3.dat,所看到的数据就不再是ASCII码格式,而是以整数的内码(二进制补码)存储的了。因此,也只能采用对应的语句(fread)读取数据。 例二. 存储记录(结构体)数据 以下程序是定义了学生信息结构体,然后输入4个学生信息、存入文件d:\\stud1.dat #include /*建立学生信息-结构体-数据文件*/ struct stud_type { char name[10]; int num,age; char addr[15]; }stud[size]; void save_dat() {FILE *fp; int i; if((fp=fopen(\ { printf(\ return; } for(i=0;i if(fwrite(&stud[i],sizeof(struct stud_type),1,fp)!=1) printf(\ fclose(fp); } main() {int i; printf(\for(i=0;i scanf(\save_dat(); } 用记事本打开数据文件stud1.dat,看到学生信息中的姓名、地址这两个字符串数据是按SACII码存储的,但学号和年龄(数值)却是按内码存储的。对应的读取该数据文件中数据的程序如下: #include /*从记录数据文件中读取学生信息数据*/ struct stud_type { char name[10]; int num,age; char addr[15]; }stud[size]; main() {int i; FILE *fp; fp=fopen(\ if(fp==NULL) {printf(\ for(i=0;i { fread(&stud[i],sizeof(struct stud_type),1,fp); printf(\ } fclose(fp); } 可以验证,存入的数据被正确地读取、显示。当然,也可以将结构体(记录)采用文本格式存储到文件中,看入下程序: #include /*建立学生信息-结构体-数据文件,用文本格式存储*/ struct stud_type { char name[10]; int num,age; char addr[15]; }stud[size]; void save_dat() {FILE *fp; int i; if((fp=fopen(\ { printf(\ return; } for(i=0;i fprintf(fp,\ fclose(fp); } main() {int i; printf(\for(i=0;i scanf(\ save_dat(); } 用记事本打开文件stud3.dat,可以看到,记录(结构体)中的数值数据也以SACII码存储的(注意比较数据文件stud1.dat和stud3.dat 在记事本中的显示区别)。 更多的知识和示例,可以参考《C程序设计》教材。