工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1927|回复: 20

麻烦帮我改改,有什么错?(已解决)

[复制链接]
发表于 2007-1-12 10:06 | 显示全部楼层 |阅读模式
谢谢各位!
原来是自己这里
#define LEN sizeof(struct student)跟后面p=(struct student *)malloc(sizeof(LEN));

想方便一点,反而不方便。。。。。。


为什么保存了之后再读取然后输出就不对?????????
读出来的数据不是保存的

#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{long num;
char name[10];
float mat,eng,com,sum,aver;
struct student *next;
};
int n;
struct student *head;

struct student *creat(void)
{struct student *head;
struct student *p1,*p2;
n=0;
clrscr();
printf("*************************CREAT*******************************\n\n");
p1=p2=(struct student *)malloc(LEN);
printf("please input name:");
scanf("%s",p1->name);
printf("please input number:");
scanf("%ld",&p1->num);
printf("please input math:");
scanf("%f",&p1->mat);
printf("please input english:");
scanf("%f",&p1->eng);
printf("please input computer:");
scanf("%f",&p1->com);
p1->sum=p1->mat+p1->eng+p1->com;
p1->aver=p1->sum/3;
head=NULL;
while(1)
{n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);
printf("please input name:");
scanf("%s",p1->name);
if((strcmp(p1->name,"0")==0))return(head);
printf("please input number:");
scanf("%ld",&p1->num);
printf("please input math:");
scanf("%f",&p1->mat);
printf("please input english:");
scanf("%f",&p1->eng);
printf("please input computer:");
scanf("%f",&p1->com);
p1->sum=p1->mat+p1->eng+p1->com;
p1->aver=p1->sum/3;
}
p2->next=NULL;
return(head);
}
void save(struct student *head)
{
FILE *fp;
struct student *p;
char outfile[30];
printf("Enter outfile name,for example c:\\student\\c.txt:\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)
{
printf("can not open the file\npress angykey out!\n");
getch();
exit(0);
}
printf("\nSaving the file......\n");
p=head;
while(p!=NULL)
{
fwrite(p,sizeof(LEN),1,fp);
p=p->next;
}
fclose(fp);
printf("-----save success!!-----\nenter anykey out!\n");
getch();
}


struct student *load()
{
struct student *p,*q,*h=NULL;
FILE *fp;
char infile[30];
printf("Enter infile name,for example c:\\student\\c.txt:\n");
scanf("%s",infile);
if((fp=fopen(infile,"rb"))==NULL)
{
printf("can not open file\nenter anykey out!\n");
getch();
exit(1);
}
printf("\n -----Loading file!-----\n");
p=(struct student *)malloc(sizeof(LEN));
if(!p)
{
printf("error!\n");
return h;
}
h=p;
while(!feof(fp))
{
if(1!=fread(p,sizeof(LEN),1,fp))
break;
p->next=(struct student *)malloc(sizeof(LEN));
if(!p->next)
{
printf("error!\n");
return h;
}
q=p;
p=p->next;
}
q->next=NULL;
fclose(fp);
printf("---Load success !!!---\nenter anykey out!\n");
getch();
return h;
}

void print(struct student *head)
{struct student *p;
printf("****************************ALL STUDENTS****************************\n");
printf("number        name           math    english     computer   sum     aver\n");
p=head;
if(p!=NULL)
   do
   {printf("%-10ld    %-10s     %-5.1f   %-5.1f       %-5.1f      %-5.1f   %-6.2f\n",p->num,p->name,p->mat,p->eng,p->com,p->sum,p->aver);
   p=p->next;
   }while(p!=NULL);
printf("press anykey out!\n");
getch();
}

main()
{float aaa=9,b;
b=sqrt(aaa);
head=creat();save(head);head=load();print(head);}

[ 本帖最后由 Sai999 于 2007-1-12 13:36 编辑 ]
发表于 2007-1-12 11:47 | 显示全部楼层
没仔细看代码,
不过百分之九十是把指针也保存了..
回复

使用道具 举报

发表于 2007-1-12 11:47 | 显示全部楼层
fwrite(p,sizeof(LEN),1,fp);
貌似只保存了指针?
回复

使用道具 举报

发表于 2007-1-12 11:49 | 显示全部楼层
指针不必保存,因为下次读进来时原来的指针就不一定正确了
读文件数据中要有一个建链表的过程(即把读进的数据的 *next 指针设置为新的地址)
回复

使用道具 举报

 楼主| 发表于 2007-1-12 11:53 | 显示全部楼层
原帖由 毛啦啦 于 2007-1-12 11:47 发表
fwrite(p,sizeof(LEN),1,fp);
貌似只保存了指针?


fwrite不是这么用的?
回复

使用道具 举报

 楼主| 发表于 2007-1-12 11:56 | 显示全部楼层
原帖由 iptton 于 2007-1-12 11:49 发表
指针不必保存,因为下次读进来时原来的指针就不一定正确了
读文件数据中要有一个建链表的过程(即把读进的数据的 *next 指针设置为新的地址)


我读数据时不是又给指针重新付值吗?
还是不明啊,可以帮我改改吗 ?
回复

使用道具 举报

发表于 2007-1-12 12:33 | 显示全部楼层
从文件中读来的指针值不可用了,要使它指向你新申请的空间的地址
回复

使用道具 举报

发表于 2007-1-12 13:03 | 显示全部楼层
刚刚仔细看了看代码,
可以把出了什么错说下吗>?
回复

使用道具 举报

发表于 2007-1-12 13:06 | 显示全部楼层
如果是我,就不写这么长的代码了。先写个写的,看看什么情况,再写个读的,再看看情况。
回复

使用道具 举报

发表于 2007-1-12 13:09 | 显示全部楼层
p=(struct student *)malloc(sizeof(LEN));

这句…… - -#
回复

使用道具 举报

发表于 2007-1-12 13:11 | 显示全部楼层
楼主是想保存链表里面的东西吧?
应该逐个写...
fwrite(p->num,.......);
fwrite(p->name,.......);
fwrite(p->mat,.......);
fwrite(p->com,.......);
fwrite(p->eng,.......);
.....
.....
不能偷懒-_-
读的时候也要逐个读...

[ 本帖最后由 毛啦啦 于 2007-1-12 13:13 编辑 ]
回复

使用道具 举报

发表于 2007-1-12 13:13 | 显示全部楼层
原帖由 毛啦啦 于 2007-1-12 13:11 发表
楼主是想保存链表里面的东西吧?
应该fwrite(p->num,.......);
fwrite(p->name,.......);
fwrite(p->mat,.......);
fwrite(p->com,.......);
fwrite(p->eng,.......);
.....
.....
不能偷 ...


他那种写法是可以的,只是保存了一个无用的指针浪费点空间
代码的问题在于

p=(struct student *)malloc(sizeof(LEN));

这句。。。  - -#
回复

使用道具 举报

 楼主| 发表于 2007-1-12 13:24 | 显示全部楼层
原帖由 iptton 于 2007-1-12 13:09 发表
p=(struct student *)malloc(sizeof(LEN));

这句…… - -#



这里申请空间,建立链表有什么问题?
今早坐了差不多4个小时就是搞这里,郁闷..............
回复

使用道具 举报

发表于 2007-1-12 13:26 | 显示全部楼层
改成  p=(struct student *)malloc(LEN);
试试吧
回复

使用道具 举报

发表于 2007-1-12 13:27 | 显示全部楼层
前面都没用错……

调试经验是要慢慢积累的
我做这个时也有很多很简单的错误浪费N多时间
回复

使用道具 举报

 楼主| 发表于 2007-1-12 13:32 | 显示全部楼层
谢谢各位!
原来是自己这里
#define LEN sizeof(struct student)

想方便一点,反而不方便。。。。。。
回复

使用道具 举报

发表于 2007-1-12 13:39 | 显示全部楼层
这样定义没错
错的是你没有记住你定义的东西表达什么
回复

使用道具 举报

 楼主| 发表于 2007-1-12 13:42 | 显示全部楼层
这代码是分开几天写的,到的后来就忘了。。。。。
又多了一点经验啊
回复

使用道具 举报

发表于 2007-1-12 13:44 | 显示全部楼层
最好把这些经验写下来

可以的话发到后院交流下

小小地做下广告
回复

使用道具 举报

发表于 2007-1-12 13:46 | 显示全部楼层
了解问题是一个层次,能把问题讲清楚又是一个层次
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-31 04:30

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表