「已注销」 2017-06-03 06:43 采纳率: 0%
浏览 1359

C语言结构顺序表数据读写问题

有以下信息管理程序,不知怎么才能把数据写入文件再读取?这个经测试应该可以写入,但重启读取时出错或不能读取。手机测试快一星期了
#include
#include
#include
#include
#define MAXSIZE 1000
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int Status; // 定义函数返回值类型

struct
{
char uname[22] = "root";
char upass[11] = "passwd";
} user;

int Login()
{
char uname[22], upass[11];
for (int i = 0; i < 4; i++)
{
printf("用户名:");
scanf("%s", &uname);
printf("密码:");
scanf("%s", &upass);
if (strcmp(user.upass, upass) == 0 && strcmp(user.uname, uname) == 0)
break;
else
{
puts("用户名或密码输入有误!");
if (i < 2)
continue;
}
puts("尝试过多,请重启程序");
return 0;
}
}

typedef struct
{
char num[11]; // 学号
char name[22]; // 姓名
double grade0, grade1, grade2, grade, avg; // 成绩
} student;

typedef student ElemType;

typedef struct
{
ElemType *elem; // 存储空间基地址
int length; // 当前长度
} SqList;

Status InitList(SqList * L) // 构造空顺序表
{
L->elem = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);
if (!L->elem)
exit(OVERFLOW);
L->length = 0;
return OK;
}

ElemType GetElem(SqList & L, int i) // 访问顺序表,找到i位置,返回给e
{
return L.elem[i];
}

int SearchName(SqList & L, char str[]) // 根据名字查找,返回该同学在顺序表中的编号
{
for (int i = 1; i <= L.length; i++)
{
if (strcmp(L.elem[i].name, str) == 0)
return i;
}
return 0;
}

int SearchNum(SqList & L, char strn[]) // 根据学号查找,返回该同学在顺序表中的编号
{
for (int i = 1; i <= L.length; i++)
{
if (strcmp(L.elem[i].num, strn) == 0)
return i;
}
return 0;
}

void SortList(SqList & L)
{
int i, k;
ElemType temp;
for (i = 1; i < L.length; i++)
{
for (k = i + 1; k < L.length + 1; k++)
{
if (L.elem[i].avg < L.elem[k].avg)
{
temp = L.elem[i];
L.elem[i] = L.elem[k];
L.elem[k] = temp;
}
}
}
puts("排序完成!");
}

Status ListInsert(SqList & L, int i, ElemType e) // 在i位置插入某个学生的信息
{
if ((i < 1) || (i > L.length + 1))
return ERROR;
if (L.length == MAXSIZE)
return ERROR;
for (int j = L.length; j >= i; j--)
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i] = e;
++L.length;
return OK;
}

Status ListDelete(SqList & L, int i) // 在顺序表中删除i位置的学生信息
//
{
if ((i < 1) || (i > L.length))
return ERROR;
for (int j = i; j <= L.length; j++)
{
L.elem[j] = L.elem[j + 1];
}
--L.length;
return OK;
}

void Input(ElemType * e)
{
printf("姓名:");
scanf("%s", e->name);
printf("学号:");
scanf("%s", e->num);
printf("英语成绩:");
scanf("%lf", &e->grade0);
printf("数学成绩:");
scanf("%lf", &e->grade1);
printf("计算机成绩:");
scanf("%lf", &e->grade2);
e->grade = e->grade0 + e->grade1 + e->grade2;
e->avg = e->grade / 3;
printf("输入完成\n\n");
}

void Output(ElemType * e)
{
printf("姓名:%-s\t学号:%-s\t英语:%5.2lf\t数学:%5.2f\t计算机:%5.2f平均:%5.2f\n\n",
e->name, e->num, e->grade0, e->grade1, e->grade2, e->avg);
}

void Save(ElemType * e)
{
}

int main()
{
SqList L;
ElemType a,b,c;
int x,choose;
FILE fp;
fp = fopen("/sdcard/ATEST/info", "rb+");
if(fp == NULL)
{
fp = fopen("/sdcard/ATEST/info","wb");
}
else
{
for (int i = 1; i <= 1000; i++)
{
if(feof(fp)) break;
fread(&L.elem[i],sizeof(ElemType), 1, fp);
/*fread(&L.elem[i].name,sizeof(L.elem[i].name), 1, fp);
fread(&L.elem[i].num,sizeof(L.elem[i].num), 1, fp);
fread(&L.elem[i].grade0,sizeof(double), 1, fp);
fread(&L.elem[i].grade1,sizeof(double), 1, fp);
fread(&L.elem[i].grade2,sizeof(double), 1, fp);
fread(&L.elem[i].avg,sizeof(double), 1, fp);
*/ }
}
// Login();
puts("
****************************学生成绩管理系统**********************************\n\t\t\t1.初始化学生信息\n\t\t\t2.查看录入的学生信息\n\t\t\t3.按姓名查看学生信息\n\t\t\t4.按学号查看学生信息\n\t\t\t5.按平均成绩排序\n\t\t\t6.删除学生信息\n\t\t\t7.保存学生信息\n\t\t\t8.添加学生信息\n\t\t\t9.修改学生信息\n\t\t\t0.退出\n*******************************************************************************\n");
while (1)
{
lo:
printf("选择:");
scanf("%d", &choose);
switch (choose)
{
case 0:
char q;
printf("确认退出?(y/n)");
scanf("%s", &q);
if (q == 'y' || q == 'Y')
{
fclose(fp);
printf("已退出");
return 0;
break;
}
else
goto lo;
break;
case 1:
if (InitList(&L))
{
printf("请输入要录入学生的人数(小于1000):");
scanf("%d", &x);
if (x < 1)
break;
else
{
for (int i = 1; i <= x; i++)
{
printf("第%d个学生:\n", i);
Input(&L.elem[i]);
}
L.length = x;
puts("");
}
break;
}
else
printf("初始化失败\n\n");
break;
case 2:
for (int i = 1; i <= x; i++)
{
a = GetElem(L, i);
Output(&a);
}
break;
case 3:
char s[22];
printf("请输入要查找的学生姓名:");
scanf("%s", s);
if (SearchName(L, s))
Output(&L.elem[SearchName(L, s)]);
else
puts("对不起,查无此人");
puts("");
break;
case 4:
char n[11];
printf("请输入要查找的学号:");
scanf("%s", n);
if (SearchNum(L, n))
Output(&L.elem[SearchNum(L, n)]);
else
puts("对不起,查无此人");
puts("");
break;
case 5:
SortList(L);
break;
case 6:
char r[22];
printf("请输入要删除信息的学生姓名:");
scanf("%s", r);
if (int id = SearchName(L, r))
{
if (ListDelete(L, id))
{
x--;
puts("删除成功");
puts("");
}
}
else
puts("对不起,查无此人");
puts("");
break;
case 7:
fseek(fp,0,0);
for (int i = 1; i <= x; i++)
{
fwrite(&L.elem[i],sizeof(ElemType), 1, fp); /*fwrite(&L.elem[i].name,sizeof(L.elem[i].name), 1, fp);
fwrite(&L.elem[i].num,sizeof(L.elem[i].num), 1, fp);
fwrite(&L.elem[i].grade0,sizeof(double), 1, fp);
fwrite(&L.elem[i].grade1,sizeof(double), 1, fp);
fwrite(&L.elem[i].grade2,sizeof(double), 1, fp);
fwrite(&L.elem[i].avg,sizeof(double), 1, fp);*/
}
break;
case 8:
printf("输入要插入的位置:");
int iid;
scanf("%d", &iid);
if (iid > L.length + 1 || iid < 0)
{
puts("非法操作!");
break;
}
printf("请输入学生信息:\n");
Input(&c);
if (ListInsert(L, iid, c))
{
x++;
puts("插入成功");
puts("");
}
else
{
puts("插入失败");
puts("");
}
break;
case 9:
char m[22];
printf("请输入要修改信息的学生姓名:");
scanf("%s", m);
if (SearchName(L, m))
{
puts("当前信息:");
Output(&L.elem[SearchName(L, m)]);
puts("\n修改信息:");
Input(&L.elem[SearchName(L, m)]);
puts("修改成功");
}
else
puts("对不起,查无此人");
puts("");
break;
default:
printf("选择无效,请重新");
continue;
}
}
return 0;
}

  • 写回答

1条回答 默认 最新

  • 小邓在路上 2017-06-05 01:11
    关注

    报的什么错误啊 ,你要贴出来啊

    评论

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗