/*
* test.c
*
* Created on: Jun 29, 2012
* Author: 孙旭
* 华清远见实验室
*/
/*使用链表和文件组合操作*/
#include <stdio.h>
#include<malloc.h>
#pragma pack(2)
typedef struct
{
char name[10];
char sno[15];
int age;
char sex[10];
struct student *next;
}student;
void AddStudentIoFile();
void writeStudentFile(student *stu);
void readStudentFile();
void ClearFile();
void menu();
void ReadRecordOfIndex();
void InsertStudentOfIndex();
void FindRecordByName();
int CompareString(char str1[],char str2[]);
int main() {
int choice;
menu();
while(1)
{
puts("请选择菜单项:");
scanf("%d",&choice);
switch(choice)
{
case 1:
AddStudentIoFile();
break;
case 2:
readStudentFile();
break;
case 3:
ReadRecordOfIndex();
break;
case 4:
InsertStudentOfIndex();
break;
case 5:
FindRecordByName();
break;
case 6:
ClearFile();
break;
default:
puts("结束输入\n");
return 0;
}
}
return 0;
}
void menu()
{
puts("+++++++++++++++++++++");
puts("1.写入学生记录");
puts("2.显示文件所有记录");
puts("3.按索引读文件记录");
puts("4.按索引插入学生记录");
puts("5.按名字查找记录");
puts("6.清空文件");
puts("++++++++++++++++++++++");
}
void AddStudentIoFile()
{
student *head,*pend,*p;
pend=(student*)malloc(sizeof(student));
head=pend;
int num,i=0;
puts("请输入要插入学生的个数:");
scanf("%d",&num);
puts("请输入学生信息:");
scanf("%s %s %d %s",pend->name,pend->sno,&pend->age,pend->sex);
for(i=0;i<num-1;i++)
{
p=(student*)malloc(sizeof(student));
scanf("%s %s %d %s",p->name,p->sno,&p->age,p->sex);
pend->next=p;
pend=p;
pend->next=NULL;
}
writeStudentFile(head);
}
void writeStudentFile(student *stu)
{
FILE *fp;
fp=fopen("/home/linux/sunxu.txt","ab+");
do
{
fwrite(stu,sizeof(student),1,fp);
stu=stu->next;
}while(stu!=NULL);
printf("完成写信息到文件!!\n");
fclose(fp);
}
void readStudentFile()
{
FILE *fp;
student *stu=NULL;
fp=fopen("/home/linux/sunxu.txt","rb");
stu=(student*)malloc(sizeof(student));
fread(stu,sizeof(student),1,fp);
printf("开始读文件信息!!\n");
do
{
printf("%s\t%s\t%d\t%s\n",stu->name,stu->sno,stu->age,stu->sex);
fread(stu,sizeof(student),1,fp);
}while(!feof(fp));
printf("完成读文件信息!!\n");
fclose(fp);
}
void ClearFile()
{
FILE *fp;
fp=fopen("/test/hu.txt","wb+");
if(fp)printf("清空完成\n");
fclose(fp);
}
void ReadRecordOfIndex()
{
FILE *fp;
int index;
student *stu;
fp=fopen("/home/linux/sunxu.txt","rb+");
if(!fp)printf("打开文件失败!!");
puts("请输入要读记录的索引号:");
scanf("%d",&index);
stu=(student*)malloc(sizeof(student));
fseek(fp,(index-1)*sizeof(student),0);
fread(stu,sizeof(student),1,fp);
printf("%s\t%s\t%d\t%s\n",stu->name,stu->sno,stu->age,stu->sex);
fclose(fp);
}
void InsertStudentOfIndex()
{
int i=0,index,count;
student stu[25],*stuToIns;
FILE *fp;
//stu=(student*)malloc(sizeof(student));
fp=fopen("/test/hu.txt","rb+");
if(!fp)printf("打开文件失败!!");
puts("请输入要插入记录的索引:");
scanf("%d",&index);
fseek(fp,(index-1)*sizeof(student),0);
while(!feof(fp))
{
fread(&stu[i],sizeof(student),1,fp);
i++;
}
count=i+1;
for(i=0;i<count;i++)
{
printf("%s\t%s\t%d\t%s\n",stu[i].name,stu[i].sno,stu[i].age,stu[i].sex);
}
stuToIns=(student*)malloc(sizeof(student));
puts("输入插入学生的信息:");
scanf("%s %s %d %s",stuToIns->name,stuToIns->sno,&stuToIns->age,stuToIns->sex);
fseek(fp,(index-1)*sizeof(student),0);
fwrite(stuToIns,sizeof(student),1,fp);
for(i=0;i<count;i++)
{
fwrite(&stu[i],sizeof(student),1,fp);
}
puts("插入记录成功!!");
fclose(fp);
}
void FindRecordByName()
{
student *stu;
char findname[20];
stu=(student*)malloc(sizeof(student));
FILE *fp;
fp=fopen("/home/linux/sunxu.txt","rb+");
puts("请输入要查找的名字:");
scanf("%s",findname);
//printf("%s",findname);
while(!feof(fp))
{
fread(stu,sizeof(student),1,fp);
if(CompareString(findname,stu->name)==1)
{
printf("%s\t%s\t%d\t%s\n",stu->name,stu->sno,stu->age,stu->sex);
return;
}
}
puts("没发现含该名字的记录");
}
int CompareString(char str1[],char str2[])
{
int i;
for(i=0;i<strlen(str1);i++)
{
if(str1[i]!=str2[i])return 0;
}
return 1;
}