| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 981 人关注过本帖
标题:【请教】文件操作,写入数据的一些问题
只看楼主 加入收藏
九月痕
Rank: 2
等 级:论坛游民
帖 子:9
专家分:20
注 册:2011-4-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
【请教】文件操作,写入数据的一些问题
代码如下
程序代码:
void save()
/*将链表中的数据保存到内存中*/
{ FILE *book_fp,*reader_fp;
  book *bk_p;
  reader *rd_p;
  bk_p=h_book; rd_p=h_reader;
  if((book_fp=fopen("book.dat","wb"))==NULL)
    {  printf("不能建立图书文件,初始化失败!请重新启动系统!\n");
       return; }
  while(bk_p!=NULL)
  {  if(fwrite(bk_p,sizeof(book),1,book_fp)!=1)
     {  printf("写数据错误!\n"); exit(0); }
     bk_p=bk_p->next;
  }
  fclose(book_fp);
  if((reader_fp=fopen("reader.dat","wb"))==NULL)
    {  printf("不能建立图书文件,初始化失败!请重新启动系统!\n"); return; }
  while(rd_p!=NULL)
  {  if(fwrite(rd_p,sizeof(reader),1,reader_fp)!=1)
     {  printf("写数据错误!\n"); exit(0); }
     rd_p=rd_p->next;
  }
  fclose(reader_fp);
}

写入的应该是  编号、名称、作者、出版社、出版时间、类别、价格、数量(我随便写了些:12345678 x s ls 2010 jy 14 40  大概这个... )
但数据却成了这些...虽然也有要存的东西,但不知道怎么把磁盘里一些地址什么的也写进去了...

12345678 RS=2 Oc Windows_NT Path=C:\Users\xuus\Desktop\x 书管理系统\;C:\Winds s\system32;C:\Windows;C:\Windows\System32\Wbem;2010 ndows\System32\jy dowsPowe  `A(   (      


还望各位前辈指点!谢谢!
搜索更多相关主题的帖子: color 
2011-11-27 12:32
心灵百合
Rank: 5Rank: 5
等 级:职业侠客
帖 子:215
专家分:367
注 册:2011-3-30
收藏
得分:0 
哪有book、reader数据类型的啊!数值用 int float double 字符用char 等!
2011-11-27 16:55
御风牧雨
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:47
专家分:110
注 册:2011-3-20
收藏
得分:0 
回复 2楼 心灵百合
估计他是定义了结构体之类的。
嗯...楼主你这都是二进制写入文件额...不知道你从屏幕读入的代码和从文件读出的代码以及结构体是咋定义的...
上面这段代码我看了下,没看出问题...
2011-11-27 20:25
九月痕
Rank: 2
等 级:论坛游民
帖 子:9
专家分:20
注 册:2011-4-16
收藏
得分:0 
回复 3楼 御风牧雨
程序代码:
void init_book()  /*初始化图书模块*/
{ book *t;
  FILE *fp;
  char ch;
  t=h_book;
  printf("\n    系统即将进行初始化,图书初始化模块:\n");
  while(1)
  {
    printf("       \n请按顺序书的编号、名称、作者、出版社、出版时间、类别、价格、数量(以空格隔开):");
    scanf("%s%s%s%s%s%s%f%d",t->number,t->name,t->author,t->publish,t->time,t->classes,&t->price,&t->kc);
    fflush(stdin);  
    t->xc=t->kc;
    t->next=NULL;
    printf("是否继续输入?(Y/N(orther))");
    scanf("%c",&ch);
    fflush(stdin);  
    switch(ch){
        case 'Y':
        case 'y':t=t->next;continue;
        default: return;
    }
  }
}
你好,这是初始化代码(初始化读者和这个类似)
2011-11-28 20:30
九月痕
Rank: 2
等 级:论坛游民
帖 子:9
专家分:20
注 册:2011-4-16
收藏
得分:0 
程序代码:
typedef struct bk {
  char number[15];
  char name[40];
  char author[20];
  char publish[50];
  char time[20];
  char classes[10];
  float price;
  int  kc;
  int  xc;
  struct bk * next;
    }book;                    /* 图书信息*/
图书的结构体
2011-11-28 20:34
御风牧雨
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:47
专家分:110
注 册:2011-3-20
收藏
得分:0 
以下是引用九月痕在2011-11-28 20:30:04的发言:

void init_book()  /*初始化图书模块*/
{ book *t;
  FILE *fp;
  char ch;
  t=h_book;
  printf("\n    系统即将进行初始化,图书初始化模块:\n");
  while(1)
  {
    printf("       \n请按顺序书的编号、名称、作者、出版社、出版时间、类别、价格、数量(以空格隔开):");
    scanf("%s%s%s%s%s%s%f%d",t->number,t->name,t->author,t->publish,t->time,t->classes,&t->price,&t->kc);
    fflush(stdin);   
    t->xc=t->kc;
    t->next=NULL;
    printf("是否继续输入?(Y/N(orther))");
    scanf("%c",&ch);
    fflush(stdin);   
    switch(ch){
        case 'Y':
        case 'y':t=t->next;continue;
        default: return;
    }
  }
}你好,这是初始化代码(初始化读者和这个类似)
这个...这段代码是不是你临时拼的或中间删了些啊?像文件指针定义了但没用,还有t->next已经指向空了,第二次循环的时候就会出问题额...
我修改了下后面的语句,并添加了printf输出的语句,发现无误...(其实想上面这段也应该不会产生那种结果...)
嗯,你可以在程序中每次修改了book结构体中的数据时都在前面和后面加上屏幕输出结构体中数据的语句,看是在哪里开始变的不对了,再仔细检查那段。
如果都无误的话,你再检查下是不是文件输入输出的语句出问题了,可以挑出来另外写个小程序测试下。
你用visual c++的调试功能跟踪各变量的情况也行。
如果方便的话你把程序发过来看看?...不过我也不能保证能找出问题所在。
另,其实在你的程序中学到了满多哦,比如说函数fflush(stdin)
在这先谢过了,呵呵!~
2011-11-28 22:40
九月痕
Rank: 2
等 级:论坛游民
帖 子:9
专家分:20
注 册:2011-4-16
收藏
得分:0 
回复 6楼 御风牧雨
嗯,以前是在初始化后直接存档的,现在把存储功能统一放到save里面了,文件指针忘记删了。。。关于t->next=NULL....额...糊涂了,基础没打好啊,呜呜。。。
嗯,这个初始化之后,我调用输出函数输出过,是没问题的,也就是说链表没问题。但是一存起来,再读取的话,就有问题了,就像我上面说的,存档文件里的内容是:12345678 RS=2 Oc Windows_NT Path=C:\Users\xuus\Desktop\x 书管理系统\;C:\Winds s\system32;C:\Windows;C:\Windows\System32\Wbem;2010 ndows\System32\jy dowsPowe  `A(   ( ;然后输出的也变成这个了......
额..这个程序还有好多地方没完善好..卡在这其他地方也不太好动..这样吧,我传到网盘然后把链接发给你,注意看下收信息。谢谢啦!
2011-11-29 10:37
我不是大虾
Rank: 2
等 级:论坛游民
帖 子:38
专家分:29
注 册:2011-10-26
收藏
得分:0 
有点麻烦
2011-11-29 11:29
御风牧雨
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:47
专家分:110
注 册:2011-3-20
收藏
得分:20 
回复 7楼 九月痕
说实话,我粗略看了五六个函数,有几个地方有问题...
还有,我并没有输出与你相类似的结果。
1.你在main()函数里没用调用load_data()函数,是以你重新运行程序时根本就没有读入数据...(不知道会不会是这个原因)
2.你main()函数中打开文件的语句要用"rb",而不是"wb",前者是读取(只读,文件不存在则打开不成功),后者是写入(文件不存在则新建,文件存在则覆盖)
     (具体可见http://topic. 中的讨论,特别是1楼和5楼)
3.find_book()函数有问题。当无所查书的时候将会输出链表的最后一本书,楼主在写程序的时候应多考虑下边界情况。
4.用Visual C++ 6.0编译时有9个warning,楼主应设法消去。
5.我看的函数里有一两个函数算法可能有些累赘(我没仔细看,只是扫了下,感觉上)比如load_data()中这么多指针...头晕...呵呵!...判断yes or no感觉用if就行了吧...
嗯,其他的函数我都没看。
添上load_data()函数后测试了添加书籍和查询书籍,都挺正常(除了3中所说问题)。
2011-11-29 21:50
九月痕
Rank: 2
等 级:论坛游民
帖 子:9
专家分:20
注 册:2011-4-16
收藏
得分:0 
回复 9楼 御风牧雨
嗯,谢谢你的帮助!我会按你的提示逐步解决。我用的是C-FREE...电脑里装了VS2010不太会用。。。
程序很乱...还没写完,两人一起写的 ,还没整理好...这些天麻烦啦!等把他解决了再来汇报,谢谢!
2011-11-30 20:28
快速回复:【请教】文件操作,写入数据的一些问题
数据加载中...
 
   



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

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