读写C++;对象转换为随机访问文件 我是C++初学者,我想做的是读写我程序中创建的工作人员对象。

读写C++;对象转换为随机访问文件 我是C++初学者,我想做的是读写我程序中创建的工作人员对象。,c++,vector,file-handling,C++,Vector,File Handling,以下是我的写作方法: void Staff::writeStaffFile(){ const int vectorSize = staffList.size(); ofstream staffDetailsFile("staffDetails.txt", ios::out | ios::binary); if (!staffDetailsFile){ cerr << "\nFile open error - Error writing staff details" <&

以下是我的写作方法:

void Staff::writeStaffFile(){
const int vectorSize = staffList.size();
ofstream staffDetailsFile("staffDetails.txt", ios::out | ios::binary);
if (!staffDetailsFile){
    cerr << "\nFile open error - Error writing staff details" << endl;
    return;
    }

for (int i=0; i<vectorSize; i++){
    staffDetailsFile.write(reinterpret_cast< const char* >(&staffList[i]), sizeof(Staff));
    }
staffDetailsFile.close();
}
void Staff::writeStaffFile(){
const int vectorSize=staffList.size();
流staffDetailsFile(“staffDetails.txt”,ios::out | ios::binary);
如果(!staffDetailsFile){

cerr您不能将Staff类型的对象写入文件,读回并期望它能工作。只有当您的类为POD(普通旧数据)时,才可能发生这种情况。您的Staff类不是POD-它包含字符串对象。
顺便说一句,如果(temp!=NULL),那么你的测试
是错误的-如果在read调用之前temp不是NULL,那么在read调用之后它就不会是NULL。

你犯了几个错误。首先是认为你 可以对写入文件的位图像执行任何操作。全部 程序外的数据必须以某种方式格式化。如果 如果需要二进制格式,则需要函数来格式化和解析 一个
int
和一个
string
(除非有充分的理由 否则,您可能应该使用现有的格式:XDR 这可能是最简单的。)

如果您的数据都是基本数据类型(
int
char[]
,等等), 写入和读取按位图像可能会 直到您更改编译器选项、版本或尝试 使用其他系统。即使是基本类型也需要格式化。(和 当然,任何带有指针的东西都需要格式化;
std::string
几乎可以肯定在它的 实施。)

最后:使用
staffDetailsFile.read的结果
没有测试读取是否成功。这是错误的
未定义的行为。当
(staffDetailsFile.read(…)
(但这只会让你 未格式化的缓冲区;您仍然需要提取数据。 很可能你甚至不知道要读多少字节, 因为
std::string
的格式可能有一个变量
长度。)

向我们展示Staff类的定义。序列化和反序列化的常用方法是重载类的插入/提取运算符以接受和返回ostream&/istream&,然后在这些方法中调用单个数据成员的插入/提取运算符。只有当所有数据成员都是基元且没有t指针或引用。在您的示例中,有两个字符串数据成员(用户名和密码),它们将其字符数组存储在对象外部,并作为指向缓冲区的指针保存。(暂时忽略SSO的任何影响)。编写、以调试模式编译并使用调试器。作为程序员,您只需花费10%的时间编写代码,90%的时间进行调试。即使它是POD,如果以后使用不同的选项或不同版本的编译器编译,您也无法期望将其读回。
void Staff::readStaffFile(){
ifstream staffDetailsFile("staffDetails.txt", ios::in | ios::binary);
if (!staffDetailsFile)
    cerr << "\nFile open error - Staff details not found" << endl;
else {
    Staff *temp = (Staff *)malloc(sizeof(Staff));
    while(!staffDetailsFile.eof()){
        staffDetailsFile.read(reinterpret_cast<char *>(temp),sizeof(Staff));
        if (temp != NULL)
            Staff::insertAccount(temp);
        }
    }
}
#include <iostream>
#include <string>
#include <malloc>
#include <vector>
#include "Person.h"

#ifndef STAFF_H
#define STAFF_H

class Staff : public Person {

public:
    Staff(int const, string,string,int,string,string,char,Designation,Department,Date,string,string,Date,bool); //staff constructor

    //set methods
    void setStaffIDNumber(int const);
    void setUsername(string);
    void setPassword(string);
    void setAccessLevel(int);


    //edit, modify other staff accounts
    static void addStaff(int);
    static int generateStaffID();
    static void deleteStaff(int, Staff*);
    static void changePassword(Staff*);
    static bool modifyStaff(int, Staff*);
    static void insertAccount(Staff*);
    static void printStaffDetails(Staff*);
    static void writeStaffFile();
    static void readStaffFile();
    static bool isValidAccount(Staff*,string, string);
    static Staff* chooseStaffAccount();
    static void searchStaff();
    static void refreshVector();

    //get methods
    Staff getStaffAccount(string);
    int getAccessLevel();
    string getUserName();
    int getStaffID();
    string getPassword();

    //search staff accounts
    static Staff* searchStaffAccount(string); //search staff accounts by userName
    static Staff* searchByID(int); //search staff accounts by ID
    static void searchByDept(Department); //Get staff registered to perticular department
    static void searchByDesignation(Designation); //Get staff registered to perticular designation
    static void sortVector();
    static bool sortByID(Staff &lhs, Staff &rhs);
    static bool isVectorEmpty();

private:
    int staffIDNumber;
    string userName;
    string passWord;
    int accessLevel;

    };

#endif