C语言问题,求高手解答。。。。。。 40

#include<stdio.h>#include<stdlib.h>#include<string.h>intn=0,i;structxuesheng{charxueh... #include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n=0,i;
struct xuesheng
{
char xuehao[20];
char xingming[20];
int sushehao;
int chuanghao;
char xingbie[5];
int nianling;
char zhuanye[20];
}st[39]; /*学生信息结构体定义*/
void open(n)
{
FILE *fp;
int i;
if((fp=fopen("F://wen.txt","rb"))==NULL)
{
exit(1);
}
fscanf(fp,"%d",&n);
for(i=0;i<n;i++)
fread(&st[i],sizeof(struct xuesheng),1,fp);
fclose(fp);
}
void save(int n)
{
FILE*fp;
int i;
if((fp=fopen("F://wen.txt","wb"))==NULL)
{
exit(1);
}
fprintf(fp,"%d",n);
for(i=0;i<n;i++)
{
fwrite(&st[i],sizeof(struct xuesheng),1,fp);
fprintf(fp,"\r\n");
}

fclose(fp);
}
void tianjia() /*录入学生信息模块*/
{
int ssh,ch;
int j;
char xz; /*选择系数定义*/
open();
do
{
printf("请输入学生信息:\n");
printf("请输入学生学号:");
scanf("%s",st[i].xuehao);
printf("\n请输入学生姓名:");
scanf("%s",st[i].xingming);
printf("\n请输入学生宿舍号:");
scanf("%d",&ssh);
st[i].sushehao=ssh;
printf("\n请输入新学生床号:");
scanf("%d",&ch);
st[i].chuanghao=ch;
printf("\n请输入学生性别:");
scanf("%s",st[i].xingbie);
printf("\n请输入学生年龄:");
scanf("%d",&st[i].nianling);
printf("\n请输入学生专业:");
scanf("%s",st[i].zhuanye); /*学生信息的输入*/
n++;
printf("\n是否继续1/0?"); /*判断是否继续输入*/
scanf("%d",&xz);
}while(xz);
save(n); /*返回主菜单*/
}
void caidan()
{
printf("====================欢迎使用学生宿舍管理系统===================");
printf("\n 1:添加学生信息\n");
printf(" 2:删除学生信息\n");
printf(" 3:查询学生信息\n");
printf(" 4:修改学生信息\n");
printf(" 5:退出系统\n");
}
void main()
{
int xuanze;
next:caidan();
printf("请输入需要进行的操作:\n");
scanf("%d",&xuanze);
switch(xuanze)
{
case 1:tianjia();break;
case 2:shanchu();break;
case 3:chaxun();break;
case 4:xiugai();break;
case 5:exit(0);
}
goto next;
}
为啥就只能保存最后一次输入的,而且文件里显示的数据还是特殊符号???
展开
 我来答
沧海雄风2009
2012-11-08 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2752万
展开全部
原因很简单

第一 只能保存最后一次 是 因为你保存时的打开方式 不是追加

因此 每次都把上次的覆盖

第二 显示特殊符号是因为你用二进制保存的

因此直接打开是乱码 特殊符号
更多追问追答
追问
我保存时用的是FOR循环,都要重新保存一次的,用追加可以啊?
追答
对 追加可以  这种东西做过N多遍了
巨人战舰
2012-11-10 · TA获得超过186个赞
知道小有建树答主
回答量:116
采纳率:0%
帮助的人:152万
展开全部
第一 文件写入方式在文件非空情况下应为“ab+”,a为追加写入。fp所指向的文件为空时,用“wb”写入,这要加个if语句判断是否为NULL
第二 既然是以‘b’的方式写文件 那么文件的后缀就应该改为.dat
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
梵天鲆韵6W
2012-11-08 · TA获得超过186个赞
知道小有建树答主
回答量:185
采纳率:100%
帮助的人:50.3万
展开全部
因为你的学生信息始终存入st[i], 而i值在整个程序就没有改变过,所以后来录入的信息也放入了st[i]中了,最后只剩一个学生的信息。

数据以特殊符号存放是正常的,因为你采用的是二进制存入方式
追问
我保存换成"W"了,为啥还是保存的特殊符号呢?谢谢了!
追答
写数据到文件的语句是这个 
fwrite(&st[i],sizeof(struct xuesheng),1,fp);

整型数据读出后会产生乱码。
不想产生乱码你可改成字符型存储
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kobe409
2012-11-08 · 超过27用户采纳过TA的回答
知道答主
回答量:166
采纳率:0%
帮助的人:75.8万
展开全部
你什么编译环境?程序能运行?
追问
能啊,VC++6.0
追答
void open(n)
不会吧,像这些定义你的编译器也能过?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式