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

C++ 如何将链表作为对象写入文件,c++,C++,在这个函数中,我试图将链接列表中的信息写入一个文件 class Employer: public People{ void tryWrite(){ ofstream file("Employer.dat",ios::out|ios::app| ios::binary); if(file.is_open()){ file<<getFirstName

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

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
在这个读取函数中,我想读取以下订单名称中的数据:Jane brown公司名称:Lime职位:职员地址: 新金斯顿之家:876-466-8778手机:543-455-6344电子邮件:dumb@yahoo.com

但是直接从文件中读取数据的是Jane brown 新金斯敦876-466-8778 543-455-6344dumb@yahoo.com

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

代替:地址:新金斯敦

空空格造成了问题,我不知道如何得到它 做我想做的事

无效测试读取{

    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

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

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

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

如果问题是关于大量代码中的某些内容,那么您必须改进问题并最小化代码

编辑

在你善意地提到真正的问题是什么之后-然后在你的tryWrite中,你一遍又一遍地打开同一个文件,覆盖以前存在的任何内容。显然,它最终会留下列表中的最后一个对象,因为之前的所有对象都会被覆盖


你应该使用ios::out | ios::in | ios::ate或ios::out | ios::app来查找现有数据的结尾并添加,而不仅仅是ios::out。

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

您可能在重新读取链接列表时遇到一些问题,因为您似乎没有执行任何操作来扫描数据中的非法字符。您使用的是空格字符作为分隔符,因此您应该小心确保首先转义保存到文件中的任何字段,即用一些空格字符替换任何空格字符逃逸序列的第二个。否则,当读回东西时,任性的空间可能会把东西扔得很糟糕


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

如果必须这样做,很难帮助您通读所有这些代码。不要发布过多的代码。@Zyx2000我去掉了不必要的代码。你可以从电子邮件中复制并粘贴你的问题吗?为什么你要在文本前放置>呢?这会导致你的文本显示为是的可能重复。当我之前发布时,问题在代码中,观众都很满意ng我的代码不会运行,我应该发布整个代码。问题是EmloyerList.h中的writeFile和Employer.h中的tryWrite函数。我想知道如何将每个链接列表写入fiile@TT你每次都在覆盖你的文件。修复它,你就会很好。@liitleadv我编辑了代码,只包含给我带来麻烦的内容。请再次查看它是否清晰。我似乎无法让它同时将两个数据写入文件。如果没有ios::app,它将仅将最后一个数据写入文件file@TT,我读了你最后的评论,现在我很困惑…你知道你应该做什么,但你没有做,你想知道为什么它不起作用?@EdJ是的,当我试着从t我的文件确实有问题,例如,我想要的地址应该是新的金斯敦,当我从文件中读取时,我得到的是新的地址,而不是新的金斯敦。
    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"); 
        em.writeFile();

   em.TestRead(); 




        system("pause");

    }