从二进制文件读取内容并加入链表

class Worker {

public:
    int m_id;                //职工编号
    string m_name;            //职工姓名
    string m_status;        //职工职务
    string m_department;    //所属部门
    Worker *m_nextEmp;        //下一个职员
};
/*
Employ 、Manager 和 Boss是 Worker 的三个子类

*/
//读取二进制文件
void WorkerManager::Get_Binary() {

     Worker *preEmp=NULL;

    Worker* head = &m_headEmp;    //l链表头结点

    ifstream ifs("WorkerMessage.bat",ios::in|ios::binary );

    if (!ifs.is_open()) {
        cout << "文件打开失败!" << endl;
        return;
    }

    ifs.read((char*)&number,sizeof(int));        //读取职员人数

    while (ifs.read((char *)preEmp, sizeof(Worker))) {
        if (preEmp->m_status == "职员") {            //根据文本中的职务创建不同类,并加入链表
            head->m_nextEmp = new Employee(preEmp->m_id,preEmp->m_name,preEmp->m_department);
            head = head->m_nextEmp;
        }
        else if (preEmp->m_status == "经理") {
            head->m_nextEmp = new Manager(preEmp->m_id, preEmp->m_name, preEmp->m_department);
            head = head->m_nextEmp;
        }
        else {            //Boss
            head->m_nextEmp = new Boss(preEmp->m_id, preEmp->m_name, preEmp->m_department);
            head = head->m_nextEmp;
        }
    }
}


//写入二进制文件
void WorkerManager::Save_Binary() {

    Worker* preEmp = m_headEmp.m_nextEmp;

    ofstream ofs("WorkerMessage.bat",ios::out | ios::binary);

    ofs.write((const char*)&m_number, sizeof(int));        //写入人数

    while (preEmp != NULL) {
        ofs.write((const char*)preEmp, sizeof(Worker));
        preEmp = preEmp->m_nextEmp;
    }
}

保存到二进制二进制文件可以执行,但是一到从里面读取,程序就会中断,我想根据读出的职务创建不同的子类合成一个链表,我到底应该怎么做呢,求解答。(顺便问一下,C++里面创建的文件流对象osf或者ifs和C语言里面的FILE *fp是类似的吗,都表示在文件中的位置)