将链表中的数据保存并加载到二进制文件c ++

时间:2017-09-14 21:12:36

标签: c++ linked-list binaryfiles

我创建了一个经典的链表,模拟了一个可以获得任何类型的数组。当然你可以删除和添加器官,所有方法都可以正常工作。

现在我必须编写用于从二进制文件写入和读取的方法,我真的不知道该怎么做 我已尝试过各种方式写入文件,到目前为止,我无法到达任何地方,我甚至不知道代码有什么问题,

这是我的链接列表代码的一部分

    template <class T>
class LinkedList
{
private:
    struct node
    {
        T data;
        node * next;
    };
    node* head;

public:
    LinkedList();
    ~LinkedList();

    void add(T value);
    int find(T value);
    bool remove(T value);
    void clear();
    bool ifEmpty() const;
    int size() const;
    void display() const;
    T getData(int index) const;

    T &operator[](int index);


    void save(ofstream& out);
};

那就是那个有效的保存方法的代码

template <class T>
void LinkedList<T>::save(ofstream& out)
{
    node* temp = head;
    T temp2 = temp->data;

    for (int i = 0; i < size(); i++)
    {
        out.write((const char*)(temp2), sizeof(temp2));
        temp = temp->next;
        temp2 = temp->data;
    }
}

如果你们中的一些专业人士可以给我一个如何做到正确的方向...

1 个答案:

答案 0 :(得分:0)

您需要先写下列表的大小。这将允许您阅读列表。如果没有读取大小,就无法决定何时停止从文件中读取数据。

另外,您有错误。这条线

        out.write((const char*)(temp2), sizeof(temp2));

需要

        out.write((const char*)(&temp2), sizeof(temp2));
                                ^^ Missing
template <class T>
void LinkedList<T>::save(ofstream& out)
{
   size_t sz = size();
   out.write((const char*)(&sz), sizeof(sz));

   node* temp = head;
   T temp2 = temp->data;

   for (int i = 0; i < size(); i++)
   {
      out.write((const char*)(&temp2), sizeof(temp2));
      temp = temp->next;
      temp2 = temp->data;
   }
}

潜在的阅读实施。

template <class T>
void LinkedList<T>:read(ifstream& in)
{
   size_t sz = 0;
   in.read((char*)(&sz), sizeof(sz));

   // Make sure that list is empty

   for ( size_t i = 0; i < sz; ++i )
   {
      T temp;
      in.read((char*)(&temp), sizeof(temp));

      // Add temp to the list.
      add(temp);
   }
}

save的更新版本,如果size()返回正确的值,则应修复空指针访问问题。

template <class T>
void LinkedList<T>::save(ofstream& out)
{
   size_t sz = size();
   out.write((const char*)(&sz), sizeof(sz));

   node* temp = head;
   for (int i = 0; i < size(); i++)
   {
      // Pull the data out of the pointer here.
      // At this point, temp should not be NULL.
      T temp2 = temp->data;
      out.write((const char*)(&temp2), sizeof(temp2));
      temp = temp->next;
   }
}