有关链表和文件的问题
这个题目是我们数据结构的课程设计,要求用链表实现英文图书管理系统,既图书的查询,添加,借阅等。。。但是要求能够从文件中读取数据并在操作完成后能够保存到文件中。请大家帮我看下为什么文件操作总是出现乱码。谢谢#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*结构体的定义,用于存放书籍及借书的信息。*/
struct book
{
int id;
char name[30],author[20];
int user,days;
struct book *next;
}books;
/* 从文件读数据*/
struct book *load()
{
struct book *p,*q,*h=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[10]; /*保存文件名*/
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("can not open file\n"); /*如不能打开,则结束程序*/
exit(1);
}
printf("\n -----Loading file!-----\n");
p=(struct book *)malloc(sizeof(struct book)); /*申请空间*/
if(!p)
{
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/
return h; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(1!=fread(p,sizeof(struct book),1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(struct book *)malloc(sizeof(struct book)); /*为下一个结点申请空间*/
if(!p->next)
{
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/
return h;
}
q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("---You have success read data from file!!!---\n");
return h; /*返回头指针*/
}
/*保存数据到文件*/
void save(struct book *h)
{
FILE *fp; /*定义指向文件的指针*/
struct book *p; /* 定义移动指针*/
char outfile[10]; /*保存输出文件名*/
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示文件名格式信息*/
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/
{
printf("can not open file\n");
exit(1);
}
printf("\nSaving file......\n"); /*打开文件,提示正在保存*/
p=h; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,sizeof(struct book),1,fp);/*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("-----save success!!-----\n"); /*显示保存成功*/
getch();
} /*打印图书信息函数*/
void print_book(struct book *h)
{
struct book *p;
p=h;
if(p==NULL)
{
printf("no books\n");
getche();
}
else
{
printf("book info:\n");
while(p!=NULL)
{
printf("%d,%s,%s,%d,%d\n",p->id,p->name,p->author,p->user,p->days);
p=p->next;
}
}
getche();
}
void main()
{
struct book *head=NULL;
struct book *h;
char name[30];
int id,i,user;
head=load();
print_book(head);
save(head);
}