Linux下学生信息管理系统链表、文件存储( 基于低级文件操作,无缓冲区)
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int HomePage(void);
void Add(void);
void Print();
void Delete(void);
void Updata(void);
void Sort(void);
void Query(void);
void SaveDataToFile();
typedef struct Student
{
int num;
char name[20];
float score;
struct Student *next;
}StuNode;
StuNode *Head = NULL;
int CountReadBytes = 0;
int CountWriteBytes = 0;
int main(void)
{
int fd=-1;
int ret=-1;
StuNode *p = NULL;
Head = (StuNode*)malloc(sizeof(StuNode));
Head->next = NULL;
p = Head;
fd=open("b.txt",O_RDWR|O_CREAT,0666);
do
{
p->next = (StuNode*)malloc(sizeof(StuNode));
lseek(fd,0,SEEK_CUR);
ret = read(fd,p->next,sizeof(StuNode));
CountReadBytes += ret;
if (0 == ret)
{
free(p->next);
p->next = NULL;
break;
}
p = p->next;
}
while (ret);
printf("TotalRead %d*40 byte\n",CountReadBytes/40);
close(fd);
while (1)
{
int op = HomePage();
switch (op)
{
case 1:
system("clear");
Add();
break;
case 2:
system("clear");
Delete();
break;
case 3:
system("clear");
Updata();
break;
case 4:
system("clear");
Query();
break;
case 5:
system("clear");
Sort();
break;
case 6:
system("clear");
Print();
break;
case 0:SaveDataToFile();
return 0;
default:
printf("请输入序号为0~6的选项!!");
}
}
}
void SaveDataToFile()
{
int fd = -1;
StuNode *p = NULL;
fd=open("b.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
p= Head;
while (p->next)
{
p = p->next;
lseek(fd,0,SEEK_CUR);
CountWriteBytes += write(fd,p,sizeof(StuNode));
}
printf("TotalWrite %d*40 byte\n",CountWriteBytes/40);
close(fd);
}
void Sort(void)
{
printf("*************************************************\n");
printf("* 采用用插入排序,添加数据时已按照成绩降序排列 *\n");
printf("*************************************************\n");
printf("\n");
printf("\n");
}
void Query(void)
{
int query_Stu_num;
StuNode *p = Head;
printf("请输入要查询的学生的学号:\n");
scanf("%d", &query_Stu_num);
while (p->next)
{
p = p->next;
if (query_Stu_num == p->num)
{
printf("%d\t%s\t%.1f\n", p->num, p->name, p->score);
return;
}
}
}
void Updata(void)
{
int num_updata, changeFlag = 1, i;
StuNode *p = Head;
printf("请输入该学生的学号:\n");
scanf("%d", &num_updata);
while (p->next)
{
p = p->next;
if (num_updata == p->num)
{
printf("\033[31m%d\t\t%s\t\t%.1f\n\033[0m", p->num, p->name, p->score);
break;
}
}
while(1)
{
printf("请选择要修改的信息项(0--停止修改, 1--学号,2--姓名,3--成绩 ,默认为3):\n");
loop:
scanf("%d", &changeFlag);
switch (changeFlag)
{
case 1:
printf("请输入修改的学号:\n");
scanf("%d", &p->num);
printf("\033[31m%d\033[0m\t\t%s\t\t%.1f\n", p->num, p->name, p->score);
break;
case 2:
printf("请输入修改的姓名:\n");
scanf("%s", p->name);
printf("%d\t\t\033[31m%s\033[0m\t\t%.1f\n", p->num, p->name, p->score);
break;
case 3:
printf("请输入修改的成绩:\n");
scanf("%f", &p->score);
printf("%d\t\t%s\t\t\033[31m%.1f\033[0m\n", p->num, p->name, p->score);
break;
case 0:
printf("\033[31m 修改成功! \033[0m\n");
return;
default:
printf("\033[31m 输入不合法! 请重新输入!:\033[0m\n");
goto loop;
break;
}
}
}
void Delete(void)
{
StuNode *p = Head,*dele = NULL;
int num_dele;
printf("请输入学号:\n");
scanf("%d", &num_dele);
while (p->next)
{
if (num_dele == p->next->num)
{
dele = p->next;
p->next = dele->next;
free(dele);
printf("\033[31m 删除成功!\033[0m\n");
Print();
dele = NULL;
return;
}
p = p->next;
}
if (p->next == NULL)
{
printf("\033[31m 该记录不存在!!!\033[0m\n");
}
Print();
}
void Print()
{
StuNode *p;
printf("学号\t\t姓名\t\t成绩\n");
p = Head;
while (p->next)
{
p = p->next;
printf("%d\t\t%s\t\t%.1f\n", p->num, p->name, p->score);
}
}
void Add(void)
{
char ch;
StuNode *temp = NULL;
StuNode *p = NULL;
printf("请输入学号:\n");
input:
temp = (StuNode*)malloc(sizeof(StuNode));
temp->next = NULL;
p = Head;
scanf("%d",&temp->num);
while (p->next)
{
p = p->next;
if (temp->num == p->num)
{
printf("该记录已存在!请重新输入:");
free(temp);
goto input;
}
}
printf("请输入姓名:\n");
scanf("%s",temp->name);
printf("请输入成绩:\n");
scanf("%f",&temp->score);
getchar();
p = Head;
while (p->next)
{
if(temp->score > p->next->score)
{
temp->next = p->next;
p->next = temp;
printf("是否继续添加?: 是(Y) 否(N)\n");
scanf("%c",&ch);
getchar();
if (ch == 'Y' || ch == 'y')
{
goto input;
}
printf("\033[31m 添加成功!\033[0m\n");
Print();
return;
}
p = p->next;
}
p->next = temp;
p = p->next;
p->next = NULL;
temp = NULL;
}
int HomePage(void)
{
int op;
printf("************学生信息管理系统*************\n");
printf("******* 1.添加学生信息 **********\n");
printf("******* 2.删除学生信息 **********\n");
printf("******* 3.修改学生信息 **********\n");
printf("******* 4.查询学生信息 **********\n");
printf("******* 5.排序学生信息 **********\n");
printf("******* 6.遍历学生信息 **********\n");
printf("******* 0.退出系统 **********\n");
printf("\n\n请输入选项:\n");
scanf("%d", &op);
if(op < 0 || op > 6)
printf("\033[31m 请输入数字0~6!:\033[0m\n");
return op;
}