| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1059 人关注过本帖
标题:有关链表和文件的问题
只看楼主 加入收藏
忆馨亦伊
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-8-26
收藏
 问题点数:0 回复次数:3 
有关链表和文件的问题
这个题目是我们数据结构的课程设计,要求用链表实现英文图书管理系统,既图书的查询,添加,借阅等。。。但是要求能够从文件中读取数据并在操作完成后能够保存到文件中。请大家帮我看下为什么文件操作总是出现乱码。谢谢
#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);
}
搜索更多相关主题的帖子: 链表 文件 
2008-09-08 19:42
忆馨亦伊
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-8-26
收藏
得分:0 
问题解决了,文件中信息保存有误。
2008-09-08 23:00
葬烟
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2008-9-3
收藏
得分:0 
问题出在文件的读入和输出方法上面。你的程序中指出每次读1块book大小的内容出来。然后从这部分内容中取出id,name,author,user,days输出。注意看你的print_book()函数中的输出语句:printf("%d,%s,%s,%d,%d\n",p->id,p->name,p->author,p->user,p->days);由于文件读入是以字符方式读入的,所以它不会自动把字符转化成整形。于是你的%d就等于把字符按整形输出,会是个很大的数字。另外由于是一块一块严格按照book大小读入的,所以要求你的文件内容严格按照你所定义的结构体的结构来创建。最后建议定义结构体时同样数据类型放一起,整形放前面,字符串放最后。
   修改过的部分如下:
   struct book
{
  int id;
  int user;
  int days;
  char name[30];
  char author[20];
  struct book *next;
}books; //这里我把结构体内容换了位置,整形与整形放一起,字符串放最后
   在print_book()函数中:
  printf("id is %c\nname is %0.30s\nauthor is %0.20s\nuser is %c\ndays is %c\n",(char)p->id,p->name,p->author,(char)p->user,(char)p->days);//name的输出严格控制在0~30个字符大小,author的输出严格控制在0~20个大小,整形的输出转型成字符类输出,其实这里不转也可以,本来就是字符读入的。另外这里的整形数大小,为了简单起见都是1位数字,否则还要加入判断数字长度,转多位字符到10进制整形数的算法。
  最后给出一个按照book结构体格式的待操作文件内容:
1   4   1   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaasuper                     2   5   3   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbb
//一个int4字节,所以每个都是一个数字3个空格,name长度为30,所以有30个a,或者剩余的补足空格,author长度20,填写方式和name一样,最后指针长度6字节,给6个空格就好。
  还有,原函数load()中的
  if(1!=fread(p,sizeof(struct book),1,fp))
  break;
  我给去掉了。
  修改过的部分在gcc4下运行正常,后面的save()就没怎么看了。因为你只说显示乱码。
2008-09-08 23:07
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
[bo][un]葬烟[/un] 在 2008-9-8 23:07 的发言:[/bo]

问题出在文件的读入和输出方法上面。你的程序中指出每次读1块book大小的内容出来。然后从这部分内容中取出id,name,author,user,days输出。注意看你的print_book()函数中的输出语句:printf("%d,%s,%s,%d,%d\n",p->id ...


爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-08 23:19
快速回复:有关链表和文件的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041330 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved