小黄人的爸爸大黄人 2016-06-03 01:42 采纳率: 40%
浏览 1322
已采纳

关于C语言的文件读写的问题

写了个简单的成绩管理系统,非常简单,但是用到了文件操作,下面贴出两个函数,求大神解释一下,问什么在对文件进行写入时会出现问题。

#include
#include
#include
#define N 20
#define MAX 30 //每班最多30个学生

typedef struct gra
{
int C; //C语言与程序设计
int ENG; //英语
int FM; //高数
int UP; //大物
int PAS; //概率论与数理统计
} GRA;

typedef struct student
{
//unsigned int studentClass;
unsigned int studentID;
char studentName[10];
//unsigned int studentTerm;
GRA studentGrade;
} STU;

void Function0()
{
int i, k, classnum, studentnum;
//unsigned int temp, temp1;
char fileCode[N];
FILE fp;
printf("多少个班级?\n");
scanf("%d", &classnum);
for (i = 0; i < classnum; i++)
{
/*printf("请输入班级编号:\n");
scanf("%u", &temp);
printf("请输入学期编号:\n");
scanf("%u", &temp1);
/
printf("请输入第%d个班级的学生数:\n", i+1);
scanf("%d", &studentnum);
STU pt = (STU) calloc(studentnum, sizeof(STU));
STU *ppt = pt; //保存pt的值
printf("请依次输入各个同学的学号、姓名和各科成绩\n");
for (k = 0; k < studentnum; k++, pt++)
{
printf("第%d个学生\n", k+1);
//printf("请依次输入各个同学的学号、姓名和各科成绩\n");
//printf("学号\t姓名\tC语言与程序设计\t大学英语\t高等数学\t大学物理\t概率论与数理统计\n");
//pt->studentClass = temp;
printf("学号:");
scanf("%u", &pt->studentID);
printf("%u\n", pt->studentID);
printf("姓名:");
scanf("%s", pt->studentName);
printf("%s\n", pt->studentName);
//scanf("%u", &(pt->studentTerm));
printf("C语言与程序设计:");
scanf("%d", &pt->studentGrade.C);
printf("%d\n", pt->studentGrade.C);
printf("大学英语:");
scanf("%d", &pt->studentGrade.ENG);
printf("%d\n", pt->studentGrade.ENG);
printf("高等数学:");
scanf("%d", &pt->studentGrade.FM);
printf("%d\n", pt->studentGrade.FM);
printf("大学物理:");
scanf("%d", &pt->studentGrade.UP);
printf("%d\n", pt->studentGrade.UP);
printf("概率论与数理统计:");
scanf("%d", &pt->studentGrade.PAS);
printf("%d\n", pt->studentGrade.PAS);
}
printf("请按格式输入文件名,文件名格式为:班级编号_学期编号,例如:04121517_201601\n");
getchar();
gets(fileCode);
//将.bin连接在fileCode后面,组成文件名
strcat(fileCode, ".bin");
fp = NULL;
if ((fp = fopen(fileCode, "wb")) == NULL)
{
printf("文件初始化错误!\n");
exit(1);
}
fwrite(pt, sizeof(STU), k, fp);
fclose(fp);
pt = ppt;
free(pt);
}
}

void Function1()
{
//char fileCode[N];
int flag = 0;
int count = 0, i;
unsigned int temp = 0;
FILE *fp = NULL;
printf("请输入希望修改信息的学生的班级编号_学期编号:\n");
fp = OpenProject();
//将文件内所有数据读入新开的结构体中进行数据修改,再放回原文件中
STU *pt = (STU *)calloc(MAX, sizeof(STU));
STU *ppt = pt;
fread(pt, sizeof(STU), MAX, fp);
//printf("%u\n", pt->studentID);
//printf("%s\n", pt->studentName);
printf("请输入希望修改信息的学生的学号:\n");
in3: scanf("%u", &temp);
for (i = 0; i <= count-1; i++, pt++)
{
if (temp == pt->studentID)
{
flag = 1;
break;
}
fseek(fp, sizeof(STU), SEEK_SET);
}
if (flag == 1)
{
printf("请重新输入该学生的各科成绩:\n");
scanf("%d", &pt->studentGrade.C);
scanf("%d", &pt->studentGrade.ENG);
scanf("%d", &pt->studentGrade.FM);
scanf("%d", &pt->studentGrade.UP);
scanf("%d", &pt->studentGrade.PAS);
}
else
{
printf("不存在此学号,请重新输入!");
goto in3;
}
fwrite(pt, sizeof(STU), count, fp);
rewind(fp);
pt = ppt;
free(pt);
fclose(fp);
}

对文件进行读写用的函数是fread和fwrite。
在Function0中,我在把pt内的数据写到文件中前,特意把数据全部输出看数据是不是正确的,pt内的数据没有问题。然而数据写到文件中去就出问题了,写进去之后的数据是错误的,Funtion1()中读取的文件数据也就错了,求大神解答。

  • 写回答

1条回答 默认 最新

  • 小灸舞 2016-06-03 02:22
    关注

    代码太长了,目测只能自己单步调试了。
    检查每一步的写入对不对,先少写入几个数据试试对不对。
    代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
    提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
    单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog