如何将链表作为对象写入文件

时间:2012-03-25 08:18:05

标签: c++

在这个函数中,我试图将链表中的信息写入文件

class Employer: public People{

            void tryWrite(){

                ofstream file("Employer.dat",ios::out|ios::app| ios::binary);


                if(file.is_open()){


                    file<<getFirstName()<<" "<<getLastName()<<" " << companyName<<" "<<position<<" "<<getTelHome()<<" "<<getTelMobile()<<" " <<email<<" "<<getAddress()<< endl;

                    file.close();
                }

            }


    };
    #endif

这是雇主类的链表操纵器

在writeFile函数的这一点上,我试图遍历链接列表并调用Employer.h中的tryWrite函数来写入链接列表中的实际数据到文件

  class EmployerList
  {
    private:

        Employer *head;//employee pointer(head pointer)

    public:     

   void writeFile(){

     Employer *temp = head;
        while (temp != NULL)
        {

            temp->tryWrite();//Employee's display method called here
            temp = temp->getNext();
        }


  }

在这个阅读功能中,我想按以下顺序阅读数据姓名:Jane brown公司名称:Lime职位:职员地址: 新金士顿主页#:876-466-8778手机号码:543-455-6344电邮:dumb@yahoo.com

但直接从文件中读取数据的是Jane Brown Lime职员  新金士顿876-466-8778 543-455-6344 dumb@yahoo.com

当它到达地址时,它将显示为:地址:新

而不是:地址:New Kingston

null空格正在创建问题,我不知道如何获取它  做我想做的事

void TestRead(){

    ifstream tryRead("em.dat", ios::in|ios::binary);


    string Email,  cName, pos,fName,lName,addr, tHome,tMobile;


    while(tryRead>>fName>>lName>>cName>>pos>>addr>>tHome>>tMobile){

        cout<<"Name: "<<fName<<lName<<endl;
        cout<<"Comapny's Name: "<<cName<<endl;
        cout<<"Position: "<<pos<<endl;
        cout<<"Address: "<<addr<<endl;
        cout<<"Home#: "<<tHome<<endl;
        cout<<"Mobile#: "<<tMobile<<endl;

                      tryRead.close();
    }


} 


};
        #endif

这是使用数据填充链表的主要内容

 #include <iostream>
    #include <string>
    #include "Employer.h"
    #include "EmployerList.h"

    using namespace std;

    void main()
    {

        EmployerList em;

        em.AddNode("nim@yahoo.com", "LIME", "Manager", "Tashauna", "Simon", "New Kingston", "876-985-8337", "876-405-3536");

        em.AddNode("ker@gmail.com", "NOKIA", "CEO", "Keric", "McDonald", "Europe", "0411-789-6548", "985-257-1111"); 

在链表填充数据后,EmployerList.h中的写文件函数被称为

        em.writeFile();

   em.TestRead(); 




        system("pause");

    }

2 个答案:

答案 0 :(得分:5)

我没有看过你的代码,因为它无关紧要。问题出在标题中,这就是我要回答的问题。

将链接列表写入文件意味着将链接列表的每个成员写入文件。链接列表是指向下一个对象的一系列对象,当您想将其转储到文件中时 - 您只需逐个转储这些对象。

当您需要重建链接列表时 - 您从文件中读取每个对象,并以相同的顺序将其链接到新的链接列表中(如果您保存了FIFO - 请确保重建相同的内容,而不是相反)。不用说,你不应该保存指针并从文件中读取它们。

如果问题是关于大量代码中的某些内容 - 您将不得不改进问题并最小化代码。

修改

在您提到真正的问题之后 - 然后在您的tryWrite中,您一遍又一遍地打开同一个文件,覆盖之前的任何内容。显然,它会让你最后从列表中得到最后一个对象,因为所有以前的对象都会被覆盖。

您应该使用ios::out | ios::in | ios::ateios::out | ios::app来寻找现有数据的末尾并添加,而不仅仅是ios::out

答案 1 :(得分:2)

据我所知,没有转录,编译和运行代码,它没有任何根本性的错误。我会从tryWrite()函数中提取ofstream,在writeFile()中打开它一次并将其作为参数传递,而不是为链表中的每个节点打开和关闭文件。

你可能在阅读链表时遇到一些问题,因为你似乎没有做任何事情来扫描数据中的非法字符。您正在使用空格字符作为分隔符,因此您应该小心确保首先转义保存到文件的任何字段(即,使用某种转义序列替换任何空格字符)。否则,当重新阅读时,一个任性的空间可能会让事情变得糟糕。

为了将来参考,如果您遇到代码问题,而不是仅仅列出所有代码并询问它有什么问题,您应该尝试至少描述您遇到的问题 - 什么是输出,在代码中你认为你做错了什么,等等。