链表表示的多叉树如何存入文件??

xu_ls 2001-03-04 08:55:00
加精
树的接点为
struct Node{
CString str;
Node *pnode[5]
}
指针可能为空; 如何写入文件,又从文件读取?请各位大侠指教!!
...全文
260 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程浪子 2001-03-06
  • 打赏
  • 举报
回复
我说说我的实现

//是与CTreeNode相匹配的“备忘录”,CTreeNode是一个树状结构的复合类(就是多叉树了)
BOOL CMemento::SaveToFile(CFile &file)
{
DWORD len = m_strName.GetLength() + 1;
file.Write(&len, sizeof(len));
file.Write(m_strName.GetBuffer(len), len);
m_strName.ReleaseBuffer();
return TRUE;
}

BOOL COpenCmd::Execute(CString filename, CTreeNode* pRoot)
{
CFile file;
if(!file.Open(filename, CFile::modeRead))
{
m_strError = _T("找不到文件:") + filename;
return FALSE;
}

BOOL ret = Execute(file, pRoot);
file.Close();
return ret;
}

BOOL COpenCmd::Execute(CFile& file, CTreeNode* pRoot)
{
CTreeNode* pNode;
CQueue queue;
CMemento* pMemo;
DWORD type, count;

file.Read(&count, sizeof(DWORD));
pRoot->SetParam(count);
if(count) queue.Add(pRoot);
while(!queue.IsEmpty())
{
file.Read(&type, sizeof(DWORD));
switch(type)
{
case ID_TREENODE:
pNode = new CTreeNode(_T(""));
break;
case ID_GROUPNODE:
pNode = new CGroupNode(_T(""));
break;
case ID_USERNODE:
pNode = new CUserNode(_T(""));
break;
case ID_POLICYNODE:
pNode = new CPolicyNode(_T(""));
break;
case ID_ACCOUNTNODE:
pNode = new CAccountNode(_T(""));
break;
}

file.Read(&count, sizeof(DWORD));
pNode->SetParam(count);
if(count) queue.Add(pNode);
static_cast<CTreeNode*>(queue.Head())->Add(pNode);

pMemo = pNode->CreateMemento();
pMemo->LoadFromFile(file);
pNode->SetMemento(pMemo);
delete pMemo;

if(static_cast<CTreeNode*>(queue.Head())->GetCount() >= static_cast<CTreeNode*>(queue.Head())->GetParam())
queue.Remove();
}

return TRUE;
}


BOOL CSaveCmd::Execute(CString filename, CTreeNode* pRoot)
{
CFile file;
if(!file.Open(filename, CFile::modeCreate|CFile::modeWrite))
{
m_strError = _T("文件打开出错:") + filename;
return FALSE;
}

BOOL ret = Execute(file, pRoot);
file.Close();
return ret;
}

BOOL CSaveCmd::Execute(CFile& file, CTreeNode* pRoot)
{
DWORD count, type;
CMemento* pMemo;

CExtentIterator i(pRoot);
count = pRoot->GetCount();
file.Write(&count, sizeof(count));
for(i.First(); !i.IsDone(); i.Next())
{
type = i.CurrentItem()->GetType();
file.Write(&type, sizeof(type));
count = i.CurrentItem()->GetCount();
file.Write(&count, sizeof(count));
pMemo = i.CurrentItem()->CreateMemento();
i.CurrentItem()->GetMemento(pMemo);
pMemo->SaveToFile(file);
delete pMemo;
}

return TRUE;
}
xu_ls 2001-03-06
  • 打赏
  • 举报
回复
谢谢楼上几为的指教。但指针部分怎么存储呢?
songshi 2001-03-06
  • 打赏
  • 举报
回复
直接写CString是可以的!(在存储时将其大小GetLength()也一同存进去,
在读取时先读大小,之后设置CString大小之后读!!!
songshi 2001-03-05
  • 打赏
  • 举报
回复
如果你在MFC中可以用序列化技术有一点点麻烦主要是内存分配等方面的
要例子和我联系。
rayyang2000 2001-03-05
  • 打赏
  • 举报
回复
直接写CString是不行的,我以前也碰到过,还是转换成char吧!
xu_ls 2001-03-05
  • 打赏
  • 举报
回复
用序列化的方法,我还没试。不知不用这种方法该怎么办?

16,551

社区成员

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

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

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