我有两节课:
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);
}
当我读取文件并保存到另一个链接列表时,我刚刚排在第一行。 我的代码出了什么问题?
答案 0 :(得分:0)
你需要
在写入文件之前序列化C ++数据对象(此处为列表)
在读取文件后将文件内容反序列化为C ++数据对象
对于简单的用例,您可以手动完成。例如,列表中的节点可以是逗号分隔列表,并且每个节点数据可以放置在文件中的新行中。在阅读文件时可以使用有关文件布局的知识。
作为可视化,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--;
}