怎样保存树控件中的所有结点信息?

linfeng1216 2003-10-18 01:30:39
应该怎么样保存更好呢?用ACCESS数据库或其它的文件格式吗?使程序每次启动时快速读出,然后在程序结束时保存.
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
linfeng1216 2004-02-13
  • 打赏
  • 举报
回复
谢谢楼上的兄弟,我用的是XML文件,并且已经成功了。
linfeng1216 2003-11-02
  • 打赏
  • 举报
回复
谢谢楼上的,用文本来保存树控件的信息我已经做好了,不过代码和你的有点不同,不过这样看不方便,所以我想再用XML来保存,不知有没有哪位大哥做过的?
flyhigh 2003-10-27
  • 打赏
  • 举报
回复
我上次写的算法有问题,readTree有bug,刚调出来
//**************************************************
// 从文件中读取树信息来初始化树的数据
//**************************************************
BOOL CSKeyTree::ReadTree(FILE *f)
{
BYTE flag;
BOOL bEnd=FALSE;
HSTREENODE hParent=STVI_ROOT,hPreSibling=STVI_LAST,hReaded=NULL;
KEYDATA keydata;
fread(&flag,1,1,f);//read begin flag
if(flag!=FLAG_BEGIN) return FALSE;
DeleteItem(STVI_ROOT);
while(!bEnd)
{
fread(&flag,1,1,f);//read flag
switch(flag)
{
case FLAG_GOUP:
ASSERT(hParent);
hPreSibling=hParent;
hParent=hParent->hParent;
if(!hParent) hParent=STVI_ROOT;
break;
case FLAG_GODOWN:
ASSERT(hReaded);
hParent=hReaded;
hPreSibling=STVI_LAST;
break;
case FLAG_DATA:
fread(&keydata.c,1,1,f);
//**************************************************
// 读取附加数据,读取与写入回调函数注意要保持一致
//**************************************************
if(ReadTreeNodeDataFunc)
ReadTreeNodeDataFunc(keydata.data,f);
else
fread(&keydata.data,sizeof(DWORD),1,f);
hReaded=InsertItem(keydata,hParent,hPreSibling);
hPreSibling=hReaded;//hjx 2003-10-26
break;
case FLAG_END:
bEnd=TRUE;
break;
default:
ASSERT(0);
break;
}
}
return TRUE;
}
AlvaChin 2003-10-21
  • 打赏
  • 举报
回复
1. XML呢,为了这个功能程序里面要加入XML Parser。
2. Ini文件很方便,现成的API,但是也容易被更改,读取函数的容错部分逻辑比较强。
我觉得,最好的办法就是自己写一个二进制文件。其实很简单,就是树结构的简单遍历而已。


==============================================================
百尺竿头,卧薪尝胆

flyhigh 2003-10-21
  • 打赏
  • 举报
回复
#define FLAG_GODOWN 0xff
#define FLAG_GOUP 0xfe
#define FLAG_DATA 0xfd
#define FLAG_END 0xfc
#define FLAG_BEGIN 0xfb

//********************************************************
// 递归将一个节点保存到文件(包含子节点)
//********************************************************
void CIndexTree::WriteBranch2File(HSTREENODE hsNode, FILE *f)
{
ASSERT(hsNode!=STVI_ROOT);
INDEX_ITEM *pItem=m_indexTree.GetItem(hsNode);
BYTE flag=FLAG_DATA;
fwrite(&flag,1,1,f);
fwrite(&pItem->character,1,1,f);
DWORD count;
if(pItem->pCandList==NULL)
count=0;
else
count=pItem->pCandList->GetCount();
fwrite(&count,sizeof(DWORD),1,f);
if(count)
{
POSITION pos=pItem->pCandList->GetHeadPosition();
long index;
while(pos)
{
index=pItem->pCandList->GetNext(pos);
fwrite(&index,sizeof(long),1,f);
}
}
HSTREENODE hChild=m_indexTree.GetChildItem(hsNode);
if(hChild)
{
flag=FLAG_GODOWN;
fwrite(&flag,1,1,f);
WriteBranch2File(hChild,f);
}
HSTREENODE hSibling=m_indexTree.GetNextSiblingItem(hsNode);
if(hSibling)
WriteBranch2File(hSibling,f);
else if(hsNode->hParent)
{
flag=FLAG_GOUP;
fwrite(&flag,1,1,f);
}
}
//***************************************
// 将树的内容保存到指定文件中
//****************************************
BOOL CIndexTree::SaveTree(FILE *f)
{
BYTE flag=FLAG_BEGIN;
fwrite(&flag,sizeof(BYTE),1,f);
WriteBranch2File(m_indexTree.GetRootItem(),f);
flag=FLAG_END;
fwrite(&flag,sizeof(BYTE),1,f);
return TRUE;
}
//************************************************************
// 树结构的序列化:
// 保存:以分支为单位,进入下一级保存一个下一级标志,
//  返回上一级保存一个向上一级的标志
// 载入:分析标志,完成树
//************************************************************
BOOL CIndexTree::LoadTree(FILE *f)
{
BYTE flag;
BOOL bEnd=FALSE;
HSTREENODE hParent=NULL,hPreSibling=NULL,hReaded=NULL;
DWORD count;
INDEX_ITEM item;
fread(&flag,1,1,f);//read begin flag
if(flag!=FLAG_BEGIN) return FALSE;
while(!bEnd)
{
fread(&flag,1,1,f);//read flag
switch(flag)
{
case FLAG_GOUP:
ASSERT(hParent);
hPreSibling=hParent;
hParent=hParent->hParent;
break;
case FLAG_GODOWN:
ASSERT(hReaded);
hParent=hReaded;
hPreSibling=NULL;
break;
case FLAG_DATA:
fread(&item.character,1,1,f);
fread(&count,sizeof(DWORD),1,f);
if(count==0)
{
item.pCandList=NULL;
}else
{
item.pCandList=new CList<long,long>;
long index;
for(DWORD i=0;i<count;i++)
{
fread(&index,sizeof(long),1,f);
item.pCandList->AddTail(index);
}
}
if(hParent==NULL) hParent=STVI_ROOT;
if(hPreSibling==NULL) hPreSibling=STVI_LAST;
hReaded=m_indexTree.InsertItem(item,hParent,hPreSibling);
break;
case FLAG_END:
bEnd=TRUE;
break;
default:
ASSERT(0);
break;
}
}
return TRUE;
}
注意将HSTREENODE替换成HTREENODE
linfeng1216 2003-10-21
  • 打赏
  • 举报
回复
up
muxilql 2003-10-18
  • 打赏
  • 举报
回复
xml
flinming 2003-10-18
  • 打赏
  • 举报
回复
ini
linfeng1216 2003-10-18
  • 打赏
  • 举报
回复
不知道用XML文件的话下次读出方不方便?
heguowei 2003-10-18
  • 打赏
  • 举报
回复
XML
awant2k 2003-10-18
  • 打赏
  • 举报
回复
数据少的话文本文件最快了,格式类似 *.ini

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧