我是C++初學者,我想要做的是讀寫我在程序中創建的Staff對象。將C++對象讀取和寫入隨機訪問文件
下面是我寫的方法:
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::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);
}
}
}
當我運行這部分時,在Visual Studio中出現以下錯誤。
未處理的異常在0x53950E9A(msvcr110d.dll)在StaffPersonnelSystem.exe:0000005:訪問衝突讀取位置0x00F5BF28。
我似乎無法理解我出錯的地方,如果有人能幫我解決這個問題,我會非常感激。
PS:這是我的工作人員類定義:
#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
向我們展示員工類定義。 –
序列化和反序列化的常用方法是爲您的類重載插入/提取操作符以接受並返回ostream&/ istream&,然後在這些方法中調用各個數據成員的插入/提取操作符。只有當你的所有數據成員都是基元而不是指針或引用時,memcpy才能工作。在你的情況下,你有兩個字符串數據成員(userName和passWord),它們將char數組存儲在對象之外,並保存爲指向緩衝區的指針。 (忽略當前SSO的任何影響)。 – rakeshdn
編寫一個[最小示例],編譯(編譯),編譯(編譯),編譯在調試模式下使用調試器。作爲一名程序員,您只需花費10%的時間編寫代碼,90%的時間調試它。 – Drop