Я начинаю с 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: 0xC0000005: Access местонахождения чтения нарушение 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), которые хранят свой массив символов вне вашего объекта и просто удерживают его как указатель на буфер. (игнорируя любые эффекты SSO на данный момент). – rakeshdn
Напишите [минимальный пример] (http://meta.tex.stackexchange.com/questions/228/ive-just-been-asked-to-write-a-minimal-example-what-is-that), скомпилируйте в режиме отладки и использовать отладчик. Как программист, вы будете тратить только 10% времени на ввод кода и 90% отладки времени. – Drop