我创建了一个经典的链表,模拟了一个可以获得任何类型的数组。当然你可以删除和添加器官,所有方法都可以正常工作。
现在我必须编写用于从二进制文件写入和读取的方法,我真的不知道该怎么做 我已尝试过各种方式写入文件,到目前为止,我无法到达任何地方,我甚至不知道代码有什么问题,
这是我的链接列表代码的一部分
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;
}
}
如果你们中的一些专业人士可以给我一个如何做到正确的方向...
答案 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;
}
}