我是C ++初学者,我想做的是读写我在程序中创建的Staff对象。
以下是我的写法:
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中收到以下错误。
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
答案 0 :(得分:0)
您不能将文件写入Staff类型的对象,将其读回并期望它能够正常工作。只有当你的班级有POD(普通旧数据)时才有可能发生这种情况。您的Staff类不是POD - 它包含字符串对象。
顺便说一句,你的测试if (temp != NULL)
是错误的 - 如果在读取调用之前temp不是NULL,它就不会是NULL。
答案 1 :(得分:0)
你犯了几个错误。首先是想你
可以使用写入文件的按位图像执行任何操作。 所有
程序外的数据必须以某种方式格式化。如果你
想要二进制格式,你需要格式化和解析的功能
一个int
和一个string
。 (除非有一些强有力的理由
除此之外,您应该使用现有格式:XDR
可能是最简单的。)
如果您的数据都是基本数据类型(int
,char[]
等),
写入和读取按位图像可能看起来像
工作。直到您更改了编译器选项或版本,或尝试过
使用另一个系统。甚至基本类型也需要格式化(和
当然,任何带指针的东西都需要格式化;
std::string
几乎肯定有其中的指针
实现。)
最后:你使用staffDetailsFile.read
的结果
无需测试读取是否成功。那是
未定义的行为。你的循环应该是while
( staffDetailsFile.read( ... ) )
。 (但这只会让你
未格式化的缓冲区;你仍然需要提取数据。
你可能甚至不知道要读取多少字节,
因为std::string
的格式可能有变量
长度。)