首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言文件操作中的有关问题,关于fread和fwrite

2014-01-22 
C语言文件操作中的问题,关于fread和fwrite#includestdio.h#includestdlib.h#define LEN sizeof(struct

C语言文件操作中的问题,关于fread和fwrite

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
long int NO;
char name[30];
float achievement[6];
float aver;
float sum;
struct student*next;
};
struct student*input(int a,int b)
{
int i=0,r;
struct student*p1,*p2,*head;
head=p1=p2=(struct student*)malloc(LEN);
while(i<a)
{
i=i+1;
p1->sum=0;
printf("请输入学号:姓名:\n");
scanf("%d%s",&p1->NO,&p1->name);
for(r=0;r<b;r++)
{
printf("请输入第%d门成绩:\n",r+1);
scanf("%f",&p1->achievement[r]);
p1->sum=p1->sum+p1->achievement[r];
}
p1->aver=p1->sum/b;
if(i==1)
{
head=p1;
}
p2=p1;
p1=(struct student*)malloc(LEN);
p2->next=p1;
}
p2->next=NULL;
return head;
}
void save(int a,struct student*head)
{
printf("请输入文件名:例[D:\\string.dat]\n");
char m[30];
scanf("%s",m);
struct student*p1,*p2;
intr=1;
p1=p2=(struct student*)malloc(LEN);
FILE*fp;
fp=fopen(m,"w");
fwrite(head,LEN,1,fp);                                  //这里是写入文件。
while(r<a)
{
r=r+1;
p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);
fwrite(p1,LEN,1,fp);
}
p2->next=NULL;
}
struct student*input(int a)
{
struct student*head;
struct student*p1,*p2;
head=p1=p2=(struct student*)malloc(LEN);
FILE*f1;
char m[30];
scanf("%s",m);
if((f1=fopen(m,"r"))==NULL)
{
printf("can not be open!\n");
exit(0);
}
intr=0;
while(r<a)
{
r=r+1;
fread(p1,LEN,1,f1);                                          //这里从文件里面读出。
printf("%d\t%s\n\n",p1->NO,p1->name);       //将读出的结构体里面的数据输 出到屏幕,可是结果不对,乱码的。
}
return(head);
fclose(f1);
}
void main()
{
struct student*head;
head=NULL;
int a,b;
scanf("%d%d",&a,&b);
head=input(a,b);
save(a,head);
input(a);
}

为什么输出的时候就是乱码的呢? 哪里有问题?
我想把链表保存进文件,之后从这个文件读出每个节点,用这些新建立一个链表,应该怎么办呢?
谢谢~~~
[解决办法]
你的程序有以下几个问题

1)链表保存,不必保存指针。因为文件中保存指针,读取的时候,也用不到。

2)链表读出,要重新为链表的节点分配内存,即重建链表。

3)b要小于6 这个,不然就会出错,
   所以:
      要断言,并且要保护
4)分配的内存要释放。

5)保存数据,不需要分配内存。
6)保存的数据,不在链表中,没有保存链表中的数据。
   
7)输入是有内存泄露, 
   p2->next=NULL;
   应该是 p1->next=NULL;

以上是错误

8)学生信息,没有必要和节点定义成一个结构体。
   单独定义学生信息;
   节点内有一个学生信息的成员,就可以了。
这个是,处理方式不太好。


[解决办法]
本来说帮你调调吧  结果 我也郁闷了;为什么 能正确写入  却不能读出来 ,谁能帮我看看阿  ! 
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{   
int NO;
char name[30];
float achievement[6];
float aver;
float sum;
struct student* next;
};
struct student *input(int a,int b)
{
int i=0,r;
struct student *p1,*p2,*head;
//head=(struct student*)malloc(LEN);
while(i<a)
{
p1=(struct student*)malloc(LEN);
p1->next=NULL;
i=i+1;
p1->sum=0;
printf("请输入学号:姓名:\n");
scanf("%d %s",&p1->NO,p1->name);
for(r=0;r<b;r++)
{   
printf("请输入第%d门成绩:\n",r+1);
scanf("%f",&p1->achievement[r]);
p1->sum=p1->sum+p1->achievement[r];
}
p1->aver=p1->sum/b;
if(1==i){
head = p1;
head->next = NULL;
}else{
p1->next = head;
head = p1;
}

}
return head;
}
void save(int a,struct student*head)


{
printf("请输入文件名:例[D:\\string.dat]\n");
char m[30];
scanf("%s",m);
struct student*p1,*p2;
int    r=1;
p1=p2=(struct student*)malloc(LEN);
FILE*fp;
fp=fopen(m,"w");
//fwrite(head,LEN,1,fp);                                  //这里是写入文件。
fwrite(&head->NO,4,1,fp);                                  //这里是写入文件。
fwrite(head->name,1,5,fp);                                  //这里是写入文件。
while(r<a)
{
r=r+1;
p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);
fwrite(p1,LEN,1,fp);
}
close(fp);
}
struct student* output(int a)                                               
{   
struct student*head;
struct student*p1,*p2;
head=p1=p2=(struct student*)malloc(LEN);
FILE *fp1;   
char m[30];
int NO,n;
char buf[5]={};
printf("输入 文件名 m\n");
scanf("%s",m);
printf("m = %s\n",m);
if((fp1=fopen(m,"r"))==NULL)               
{   
printf("can not be open!\n");
exit(0);
}
int    r=0;
printf("a= %d\n",a);
while(r<a)
{
r=r+1;
n = fread(&NO,4,1,fp1);  
printf("n1 = %d\n",n);  
printf("%d\n",NO);      
n = fread(buf,1,5,fp1);  
printf("n2  = %d\n",n);   
printf("%s\n",buf);     
printf("why  ???\n");       //将读出的结构体里面的数据输 出到屏幕,可是结果不对,乱码的。
}
fclose(fp1);
return(head);
}
void main()
{
struct student *head,*p;
head=NULL;
int a,b;
printf("输入 学生数 和 课程数\n");
scanf("%d %d",&a,&b);
head=input(a,b);
save(a,head);
for(p=head;p!=NULL;p=p->next){
printf("%d %s\n",p->NO,p->name);
}

output(a);
}

热点排行