使用C ++将链接列表保存到文件中

时间:2015-04-19 19:03:59

标签: c++

我有两节课:

class People
{
    char* Name;
    int ID;
    struct Date Birthday;
}


class Student : public People
{

    int Grace;
    int NoP;
    float *Score;
}

我的链接列表:

typedef struct _List
{
    Node *head;
    Node *tail;
} List;
class Node
{
private:
    People* data;
    Node* next;
public:
    static void addelement(List &l,People *dt);
    static void readfile(List &l);
    static void writefile(List l);
};

我创建了一些变量并将它们添加到列表中:

People* st1= new Student(...); Node::addelement(l,st1);
    People* st2= new Student(...); Node::addelement(l,st2);

这是我用List编写写/读文件的两个函数:

void Node::writefile(List l)
{
    Node *p = l.head;
    FILE * pFile;
    pFile = fopen ("myfile.Dat","wb");
    while(p)
    {
        if (pFile!=NULL)
        {
            fwrite(p,sizeof(Node),1,pFile);
            fclose (pFile);
        }
        p=p->next;
    }
}
void Node::readfile(List &l)
{
Node *r;
FILE * pFile;
pFile=fopen("myfile.Dat","rb");
do
{
r=new Node [sizeof(Node)];
fread(r,sizeof(Node),1,pFile);
r->next=NULL;
if(l.head==NULL) l.head=l.tail=r;
else
  {
      l.tail->next=r;
      l.tail=l.tail->next;
  }
}while(!feof(pFile));
fclose(pFile);
}

当我读取文件并保存到另一个链接列表时,我刚刚排在第一行。 我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

你需要

  1. 在写入文件之前序列化C ++数据对象(此处为列表)

  2. 在读取文件后将文件内容反序列化为C ++数据对象

  3. 对于简单的用例,您可以手动完成。例如,列表中的节点可以是逗号分隔列表,并且每个节点数据可以放置在文件中的新行中。在阅读文件时可以使用有关文件布局的知识。

    作为可视化,name,id,dob的文件内容可能类似于

    Alice, 90, 1999/04/01,
    Bob, 20, 2000/01/04,
    

    但是,如果项目是长期的并且数据结构预计会发生变化(这很正常),那么最好使用序列化/反序列化库。一个不错的选择是使用Google Protocol Buffers,请参阅https://developers.google.com/protocol-buffers/docs/cpptutorial

    上的一个简单示例

答案 1 :(得分:0)

问题是您的读写文件功能在层次结构中处于错误的级别。它们应该在列表级别,而不是节点级别。如果你想在节点级别使用它们,那么每个节点都应该拥有它自己的文件。请尝试以下方法:

typedef struct _Node
{
    People* data;
    Node* next;        
} Node;

// Only pass out copies of nodes, never nodes to ensure integrity of list items.

Class CLinkedList
{
protected:
    int     m_numItems;
    Node*   m_head;
    Node*   m_tail;

public:
    CLinkedList();
    ~CLinkedList(){};

    static void readfile(char* filename = "myfile.Dat");
    static void writefile(char* filename = "myfile.Dat");

    static void addelement(People *dt);
    static void removElement(People *dt);
};

CLinkedList::CLinkedList()
{
    // Initialize the linked list class here
}

void CLinkedList::writefile(char* filename)
{
    // Iterate through list and write values
}
void CLinkedList::readfile(char* filename)
{
    // Iterate through list and read values
}

void CLinkedList::addelement(People *dt)
{
    // Add elements

    m_numItems++;
}

void CLinkedList::removeElement(People *dt)
{
    // Add elements

    // delete the element after removing it from the list

    m_numItems--;
}