返回   cpper编程论坛 > C/CPP/TMP/GP
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2008-07-19
初级会员
 
注册日期: 2008-04-18
帖子: 4
BlueSky-Thinker 正向着好的方向发展
帖子 二进制保存链表的问题

前一阵子在搞C语言课程设计,交作业时,检查我的程序的一个头顶闪光的老师说我的程序做的很笨。原因是我在程序中把链表的节点里的数据信息用文本文件保存起来,也从文件中读取数据以创建链表。按他的说法,我应该用二进制文件把整个链表保存起来,包括数据结构和节点上的数据。我从没有听说过可以这样做的,当时表示质疑,他说整个链表就是内存中的一段二进制数据,听起来有道理,当时没有时间了,所以没有细问他。现在想起来,却不知道怎么做,到网上搜了搜,也没找到答案。觉得不太可能这样做,不知各位有什么高见。
注明:我乃菜鸟一只,若有解决方法,请讲得浅易些。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2008-07-20
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,560
文章: 6
cat 正向着好的方向发展
默认 回复: 二进制保存链表的问题

指针不能存下来的吧?
我比较喜欢你的做法,而且最好不用二进制,而是用文本方式,改起来方便。
那种钻牛角尖优化出来的东西最后没用反而带来麻烦的概率很高。不是超海量数据就没必要这么干。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2008-07-22
liuxinyu 的头像
高级会员
 
注册日期: 2006-02-09
帖子: 303
文章: 48
liuxinyu 正向着好的方向发展
默认 回复: 二进制保存链表的问题

我想可能本意是“持久化”问题中的,深拷贝持久化。
能做到深拷贝就达到目的了。

c++ 代码:
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. struct item{
  6.   item(const char* x, item* n=0):data(x),next(n){ }
  7.   item(const item& i):data(i.data),next(i.next){ }
  8.  
  9.   ~item(){ delete next; }
  10.  
  11.   std::string data;
  12.   item* next;
  13. };
  14.  
  15. void print_list(item* li){
  16.   if(li){
  17.     std::cout<<li->data<<"==>";
  18.     print_list(li->next);
  19.   }
  20.   else
  21.     std::cout<<"null\n";
  22. }
  23.  
  24. void save_list(item* li){
  25.   std::ofstream f("foo.dat");
  26.   while(li){
  27.     f<<li->data<<",";
  28.     li=li->next;
  29.   }
  30. }
  31.  
  32. item* load_item(std::ifstream& f){
  33.   item* x=0;
  34.   char c;
  35.   while(f.get(c) && c!=','){
  36.     if(!x)
  37.       x=new item("");
  38.     x->data+=c;
  39.   }
  40.   if(c==',')
  41.     x->next=load_item(f);
  42.   return x;
  43. }
  44.  
  45. item* load_list(){
  46.   std::ifstream f("foo.dat");
  47.   return load_item(f);
  48. }
  49.  
  50. int main(int, char**){
  51.   item* li=new item("hello", new item("world", new item("?", new item("foo"))));
  52.   print_list(li);
  53.   save_list(li);
  54.   delete li;
  55.   li=load_list();
  56.   print_list(li);
  57.   delete li;
  58. }

程序运行:
liuuuxin@WEIFANG ~/temp
$ g++ test.cpp -o test

liuuuxin@WEIFANG ~/temp
$ ./test
hello==>world==>?==>foo==>null
hello==>world==>?==>foo==>null
__________________
==================================
http://liuxinyu95.googlepages.com
liuxinyu95@gmail.com
==================================
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2008-07-26
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,560
文章: 6
cat 正向着好的方向发展
默认 回复: 二进制保存链表的问题

这也是遍历链表然后deserialize的时候重新创建嘛~ 我觉得是那个头顶闪光的突然闪出一个想法也没怎么验证就说出来了……
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2008-07-28
liuxinyu 的头像
高级会员
 
注册日期: 2006-02-09
帖子: 303
文章: 48
liuxinyu 正向着好的方向发展
默认 回复: 二进制保存链表的问题

引用:
作者: cat 查看帖子
这也是遍历链表然后deserialize的时候重新创建嘛~ 我觉得是那个头顶闪光的突然闪出一个想法也没怎么验证就说出来了……
也不是不行,不过拿C++的iostream,不如直接fread爽了,就像手工读bitmap那样。想想就头疼。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2008-08-06
初级会员
 
注册日期: 2008-04-18
帖子: 4
BlueSky-Thinker 正向着好的方向发展
默认 回复: 二进制保存链表的问题

引用:
作者: cat 查看帖子
这也是遍历链表然后deserialize的时候重新创建嘛~ 我觉得是那个头顶闪光的突然闪出一个想法也没怎么验证就说出来了……
下次在实验室看见他,一定要向他问个清楚。我才是一个大一的学生,不知 liuxinyu高手说的“深拷贝”是什么,我再搜搜吧。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2008-09-05
初级会员
 
注册日期: 2004-10-21
帖子: 7
allnickname 正向着好的方向发展
默认 回复: 二进制保存链表的问题

标准C++提供了二进制流操作库了吗?好像《汤姆斯旺》里提到过要自己写二进制IO.
这个貌似C语言方便一些。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #8 (permalink)  
旧 2008-09-06
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,135
文章: 20
polyrandom 正向着好的方向发展
默认 回复: 二进制保存链表的问题

引用:
作者: allnickname 查看帖子
标准C++提供了二进制流操作库了吗?好像《汤姆斯旺》里提到过要自己写二进制IO.
这个貌似C语言方便一些。
C++支持二进制流,但是没有缺省的二进制方式插入/提取运算符。不过不管怎样说,不至于比C不方便,至少和C一个层次。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 12:51 PM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0