如何将链接列表对象写入文件

时间:2012-03-24 19:00:42

标签: c++ file linked-list

void writeFile(){
    Employer *temp = head;
    while (temp != NULL)
    {
        temp->tryWrite();//Employee's display method called here
        temp = temp->getNext();
    }
}

void main(){
    EmployerList em;
    em.AddNode("des@yahoo.com", "LIME", "Manager", "ming", "ding", "Newston", "43", "873");
    em.AddNode("sw@gmail.com", "NOKIA", "CEO", "rew", "nbv", "Europe", "0411-789-6548", "985-257-1111"); 
    //em.writeFile();
}

我正在尝试将链接列表作为对象写入文件,而不是像tryWrite函数中那样单独编写。有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

简短的回答是“不,你不能这样做。”

链接列表,几乎按定义,包含指针。至少对于长期存储(即,在程序的单次执行之外存活的任何东西),通过存储指向磁盘的指针,然后将其读回来,你无法获得任何有意义的东西。

序列化包含指针的数据结构通常需要“追逐”这些指针,并以某种方式“展平”结构。对于线性链表,您可能只想按顺序编写节点。另一种可能性是在文件中替换指向内存的指针。如果您需要在磁盘上维护相同类型的结构(例如,您希望可以在磁盘上操作的树作为实际树而不仅仅是一系列记录),那么这非常有用。

无论如何,你只需要存储原始数据就不太有用了。

答案 1 :(得分:0)

您显示的代码不完整,无法编译。您缺少类成员变量的声明。 EmployerList的构造函数可能应该使用const Employer &并存储它;它不应该处理用于初始化雇主的所有变量。

将链接列表写入文件非常棘手。你不能有意义地写指针;您必须以标准化,易读的格式为每个项目编写数据值。您在文件中使用邻近度来表示“下一个”(和“上一个”)关系。此过程在输出上称为“序列化”,在输入上称为“反序列化”。


这个成语:

    Employer *node = new Employer(Email, cName, pos, fName, lName, addr, tHome, tMobile);  

    //if memory was sucessfully allocated
    if (node != NULL)

是古老的(预标准,意味着1998年之前的标准)C ++。你没有调用'no throw'分配器;如果分配失败,则抛出异常。因此,分配检查是多余的。

这不会造成直接问题;测试只是浪费(并且不必要地缩进代码)。如果您的教科书使用这种技术,您可能应该获得一本较新的教科书。

(我还注意到我必须修改间距以使代码保持一致;编程的一致性非常重要。)

答案 2 :(得分:0)

如果您的意思是将链接列表存储到与存储在内存中的链接完全相同,则不能。因为链接列表中的指针是“易变的”,所以当您在不同的时间运行应用程序时,它们所指向的内容可能会非常不同。这意味着坚持指针本身毫无意义。

但是您可以将链接列表中的节点以及它们之间的关系(以前通过指针维护)保存到磁盘。如果您使用的是单个链接列表,只需从头到尾逐个存储节点。