在编写学生管理系统时,不得不将客户录入的学生信息保存于本地,所以,这个时候就需要我们能够将链表所存入的消息和文件夹的写入和读取紧密联系起来,这里我将对他逐一讲解:
打开文件
函数原型为:_CRTIMP FILE * __cdecl fopen(const char *, const char *);
第一参数为文件名,第二个参数为打开模式。
打开成功,fopen返回一个结构指针地址,否则返回一个NULL。如果没有指定文件路径,则默认为当前工作目录。如:
FILE *fp;
fp = fopen(“c:\temp\test.txt”, “r”) //由于反斜杠\是控制字符,所以必须再加一个反斜杠
使用fopen()函数打开的文件会先将文件复制到缓冲区。注意:所下达的读取或写入动作,都是针对缓冲区进行存取而不是磁盘,只有当使用fclose()函数关闭文件时,缓冲区中的数据才会写入磁盘。
谈文件打开模式
打开文本文件:
“r”:只能从文件中读数据,该文件必须先存在,否则打开失败
“w”:只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
“a”:向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
“r+”:可读/写数据,该文件必须先存在,否则打开失败
“w+”:可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
“a+”:可读/写数据,原来的文件不被删去,位置指针移到文件末尾
打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母’b’,以表示以二进制形式打开文件。
关闭文件
函数原型为:_CRTIMP int __cdecl fclose(FILE *);
关闭成功返回值0,否则返回非零值。
注:在执行完文件的操作后,要进行“关闭文件”操作。虽然程序在结束前会自动关闭所有的打开文件,但文件打开过多会导致系统运行缓慢,这时就要自行手动关闭不再使用的文件,来提高系统整体的执行效率。
void add_file(Student *head, int x){ //实现链表信息录入文本
FILE *fp;
if (1 == x){
fp = fopen("1.txt", "w");
if (NULL == fp)
printf("该文件打开失败!");
while (head->next != NULL){
head = head->next;
fprintf(fp, "%-6s %-6d %-6d %-6d %-6d\n", head->name, head->number, head->chinese, head->math, head->english);
}
fclose(fp);
printf("(一班学生信息已录入,并保存于1.txt当中!!!)\n\n");
}
if (2 == x){
fp = fopen("2.txt", "w");
if (NULL == fp)
printf("该文件打开失败!");
while (head->next != NULL){
head = head->next;
fprintf(fp, "%-6s %-6d %-6d %-6d %-6d\n", head->name, head->number, head->chinese, head->math, head->english);
}
fclose(fp);
printf("(二班学生信息已录入,并保存于2.txt当中!!!)\n\n");
}
}
void file(){ //实现两文件夹的合并功能
FILE *fp, *p;
Student look;
//以只读方式打开文件
fp = fopen("1.txt", "r+");
//判断文件不存在的情况
if (NULL == fp)
printf("该文件打开失败!");
//以写方式打开文件
p = fopen("3.txt", "w");
while (fscanf(fp, "%s%d%d%d%d", look.name, &look.number, &look.chinese, &look.math, &look.english) != EOF){
fprintf(p, "%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
printf("%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
}
fclose(fp);
fp = fopen("2.txt", "r+");
while (fscanf(fp, "%s%d%d%d%d", look.name, &look.number, &look.chinese, &look.math, &look.english) != EOF){
fprintf(p, "%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
printf("%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
}
fclose(fp);
fclose(p);
}
void Mix(){ //实现一二班成绩合并功能
FILE *fp, *p;
Student look;
fp = fopen("1.txt", "r+");
if (NULL == fp)
printf("该文件打开失败!");
p = fopen("3.txt", "w");
while (fscanf(fp, "%s%d%d%d%d", look.name, &look.number, &look.chinese, &look.math, &look.english) != EOF){
fprintf(p, "%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
printf("%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
}
fclose(fp);
fp = fopen("2.txt", "r+");
if (NULL == fp)
printf("该文件打开失败!");
while (fscanf(fp, "%s%d%d%d%d", look.name, &look.number, &look.chinese, &look.math, &look.english) != EOF){
fprintf(p, "%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
printf("%-6s %-6d %-6d %-6d %-6d\n", look.name, look.number, look.chinese, look.math, look.english);
}
fclose(fp);
fclose(p);
}