在这个函数中,我试图将链表中的信息写入文件
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
这是雇主类的链表操纵器
在writeFile函数的这一点上,我试图遍历链接列表并调用Employer.h中的tryWrite函数来写入链接列表中的实际数据到文件
class EmployerList
{
private:
Employer *head;//employee pointer(head pointer)
public:
void writeFile(){
Employer *temp = head;
while (temp != NULL)
{
temp->tryWrite();//Employee's display method called here
temp = temp->getNext();
}
}
在这个阅读功能中,我想按以下顺序阅读数据姓名:Jane brown公司名称:Lime职位:职员地址: 新金士顿主页#:876-466-8778手机号码:543-455-6344电邮:dumb@yahoo.com
但直接从文件中读取数据的是Jane Brown Lime职员 新金士顿876-466-8778 543-455-6344 dumb@yahoo.com
当它到达地址时,它将显示为:地址:新
而不是:地址:New Kingston
null空格正在创建问题,我不知道如何获取它 做我想做的事
void TestRead(){
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");
在链表填充数据后,EmployerList.h中的写文件函数被称为
em.writeFile();
em.TestRead();
system("pause");
}
答案 0 :(得分:5)
我没有看过你的代码,因为它无关紧要。问题出在标题中,这就是我要回答的问题。
将链接列表写入文件意味着将链接列表的每个成员写入文件。链接列表是指向下一个对象的一系列对象,当您想将其转储到文件中时 - 您只需逐个转储这些对象。
当您需要重建链接列表时 - 您从文件中读取每个对象,并以相同的顺序将其链接到新的链接列表中(如果您保存了FIFO - 请确保重建相同的内容,而不是相反)。不用说,你不应该保存指针并从文件中读取它们。
如果问题是关于大量代码中的某些内容 - 您将不得不改进问题并最小化代码。
修改强>
在您提到真正的问题之后 - 然后在您的tryWrite
中,您一遍又一遍地打开同一个文件,覆盖之前的任何内容。显然,它会让你最后从列表中得到最后一个对象,因为所有以前的对象都会被覆盖。
您应该使用ios::out | ios::in | ios::ate
或ios::out | ios::app
来寻找现有数据的末尾并添加,而不仅仅是ios::out
。
答案 1 :(得分:2)
据我所知,没有转录,编译和运行代码,它没有任何根本性的错误。我会从tryWrite()函数中提取ofstream,在writeFile()中打开它一次并将其作为参数传递,而不是为链表中的每个节点打开和关闭文件。
你可能在阅读链表时遇到一些问题,因为你似乎没有做任何事情来扫描数据中的非法字符。您正在使用空格字符作为分隔符,因此您应该小心确保首先转义保存到文件的任何字段(即,使用某种转义序列替换任何空格字符)。否则,当重新阅读时,一个任性的空间可能会让事情变得糟糕。
为了将来参考,如果您遇到代码问题,而不是仅仅列出所有代码并询问它有什么问题,您应该尝试至少描述您遇到的问题 - 什么是输出,在代码中你认为你做错了什么,等等。