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函数中那样单独编写。有什么帮助吗?
答案 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)
如果您的意思是将链接列表存储到与存储在内存中的链接完全相同,则不能。因为链接列表中的指针是“易变的”,所以当您在不同的时间运行应用程序时,它们所指向的内容可能会非常不同。这意味着坚持指针本身毫无意义。
但是您可以将链接列表中的节点以及它们之间的关系(以前通过指针维护)保存到磁盘。如果您使用的是单个链接列表,只需从头到尾逐个存储节点。