本帖最后由 绯色の胖子 于 2015-6-12 18:10 编辑
大神们,这个程序编译没有错,运行强制停止,什么问题?运行的时候 点5 就是 添加后报道的学生 只要是添加 就出错停止运行
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <string.h>
#define SIZE 7
struct student
{char num[20];
char name[10];
char time;
}std[SIZE];
void menu();
void dianming();
void absent();
void add();
void save();
void main()
{
int i,k;
FILE *fp;
if((fp=fopen("e:\\file20.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
for(i=0;i<SIZE;i++)
fscanf(fp,"%s %s %c",std.num,std.name,&std.time);
printf("**************************************************************************\n");
printf("**************************************************************************\n");
printf("****************************欢迎使用上课随机点名程序**********************\n");
printf("****** 输入1:显示所有同学点名情况 *********\n");
printf("****** 输入2:开始点名 *********\n");
printf("****** 输入3:更新文件 *********\n");
printf("****** 输入4:缺席同学的情况 *********\n");
printf("****** 输入5:添加后报道学生信息 *********\n");
printf("****** 输入6: 退出 *********\n");
printf("**************************************************************************\n");
while(1)
{printf("please choose ");
scanf("%d",&k);
switch(k)
{
case 1:
printf("number name Y or N\n");
for(i=0;i<SIZE;i++)
printf(" %s %s %c\n",std.num,std.name,std.time);
break;
case 2:
dianming();
break;
case 3:
save();
printf("****************************文件更新成功!退出请按5**************************\n");
break;
case 4: absent();
break;
case 5:
/*添加学生信息*/add();
break;
case 6:
exit(0);
}
fclose(fp);
}
}
void add()
{
FILE *fp;
int n,i;
struct student stu;
if((fp=fopen("e:\\file20.txt","a"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
else //如果文件已经存在,可以追加学生信息
{printf("请输入要添加的学生数量,按回车键确认:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("\n请输入第%d个学生的学号 姓名 缺席情况,用空格分开,并按回车键确认:\n",i);
scanf("%s%s",stu.num,stu.name);
fprintf(fp,"%s %s %s\n",stu.num,stu.name,stu.time);
}
}
fclose(fp);
}
void dianming()
{int n,j,m;
printf("请输入数量:");
scanf("%d",&n);
j=rand()%7;/*调用rand函数进行点名*/
for(j=0;j<n;j++)
{ printf(" %s %s ",std[j].num,std[j].name);
printf("缺席请按1否则请按2:");
scanf("%d",&m);
if(m==1)
std[j].time='Y';
else
if(m==2)
printf("没有缺席");}
}
void absent()
{int i;
for(i=0;i<SIZE;i++)
if(std.time!='N')
printf(" %s %s %c\n",std.num,std.name,std.time);
}
void save()
{int i;
FILE *fp;
if((fp=fopen("e:\\file20.txt","w+"))==NULL)
{printf("文件打开失败\n");
exit(0);}
for(i=0;i<SIZE;i++) {fprintf(fp,"%s %s %c\n",std.num,std.name,std.time);
}}
编译没问题不一定就是ok的,闪退应该是运行时问题
大致看了一下,没细想,你可以考虑:是不是程序瞬间执行完毕,while部分没有停顿、是不是读或写文件错了导致程序错误……
你可以一部分一部分的输出一些调试信息,
[查看全文]
那啥,麻烦你能把这个程序的具体要求写出来吗?你的代码我改了几次,感觉效果不是很理想,特别是你在读取文件内容到内存中,却使用数组这种定长的数据结构来存放,因为文件内容如果没有事先设计好,程序怎么能知道应该读取几条数据?而且你既然包含了添加信息的功能,那么文件的内容也就是可变的,更不应该使用固定长度的方式,换成链表才更实际点。麻烦你直接说一下这个程序要实现的各种功能,以及你那个记录学生的编号,姓名,以及缺席记录的文件内容是按什么格式组织的,直接用文字说一下吧。你贴了代码我反而不好改了,代码的风格太乱,适当把函数声明,和函数的实现分别拆开放在头文件,源文件中,不要这样直接在主函数文件里面堆叠。
[查看全文]