【发布时间】:2014-01-20 11:15:00
【问题描述】:
我是 C++ 初学者,我想做的是读写我在程序中创建的 Staff 对象。
下面是我的Write方法:
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();
}
Staff 对象保存在向量中,在这里我尝试将向量中可用的所有这些人员对象保存到文件中。它工作并将数据写入文件。
我出错的地方是读取文件。这是我的阅读方法:
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 中收到以下错误。
StaffPersonnelSystem.exe 中 0x53950E9A (msvcr110d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 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
【问题讨论】:
-
向我们展示 Staff 类定义。
-
序列化和反序列化的常用方法是重载插入/提取运算符,让您的类接受并返回 ostream& / istream& ,然后在这些方法中调用各个数据成员的插入/提取运算符。仅当您的所有数据成员都是基元而不是指针或引用时,memcpy 才会起作用。在您的情况下,您有两个字符串数据成员(userName 和 passWord),它们将它们的 char 数组存储在您的对象之外,并作为指向缓冲区的指针保存。 (暂时忽略 SSO 的任何影响)。
-
写一个minimal example,在调试模式下编译并使用调试器。作为一名程序员,你只会花 10% 的时间编写代码和 90% 的时间调试它。
标签: c++ vector file-handling