I am using C++ Builder and I have a vector array of Appointment
objects.
I want to save it to and load it from a file.
Currently, I am using ifstream and ofstream with binary files. I have a header that contains the size of the vector that will be saved alongside the data, so as to know its size when loading.
Is serilization a better way to do this?
If so, do I need to use the boost library, or another way?
Here is my current code:
class appointment { public: appointment(); appointment(TDateTime aDate, TDateTime aReminderDateTime, string aType, string aLocation, string aComments, bool aIsImportant) { appDateTime = aDate; appReminderDateTime = aReminderDateTime; appType = aType; appLocation = aLocation; appComments = aComments; appIsImportant = aIsImportant; } void setAppDateTime(TDateTime aDateTime) { appDateTime = aDateTime; } void setappReminderDateTime(TDateTime aReminderDateTime) { appReminderDateTime = aReminderDateTime; } /* void printAppointmentDetails() { cout << "Appointment Date: " << appDateTime << endl; cout << "Appointment Reminder Date: " << appReminderDateTime << endl; cout << "Appointment Type: " << appType << endl; cout << "Appointment Location: " << appLocation << endl; cout << "Appointment Comments: " << appComments << endl; if (appIsImportant) { cout << "Appointment IsImportant: " << "Yes" << endl; } else { cout << "Appointment IsImportant: " << "No" << endl; } } */ void setType(string aType) { appType = aType; } void setLocation(string aLocation) { appLocation = aLocation; } void setComments(string aComments) { appComments = aComments; } void setIsImportant(bool aIsImportant) { appIsImportant = aIsImportant; } TDateTime getAppDateTime() { return appDateTime; } TDateTime getAppReminderDateTime() { return appReminderDateTime; } string getType() { return appType; } string getLocation() { return appLocation; } string getComments() { return appComments; } bool getIsImportant() { return appIsImportant; } private: //appointment(); TDateTime appDateTime; TDateTime appReminderDateTime; string appType; string appLocation; string appComments; bool appIsImportant; //person owner; }; class calendar { public: calendar() { //loadFromFile(); //load persons //calculateimportantAppointments } ~calendar() { saveToFile(); } //addperson //editperson //removeperson void createAppointment(TDateTime aDate, TDateTime aReminderDateTime, string aType, string aLocation, string aComments, bool aIsImportant) { appointment newAppointment(aDate, aReminderDateTime, aType, aLocation, aComments, aIsImportant); appointments.push_back(newAppointment); } /* void printAllAppointmentDetails() { for (int i = 0; i < appointments.size(); i++) { appointments[i].printAppointmentDetails(); } } void calculateImportantAppointments() { } int getNumberOfImportantAppointments() { int intImportantAppointmentCount = 0; for (int i = 0; i < appointments.size(); i++) { if (appointments[i].getIsImportant()) intImportantAppointmentCount += 1; } return intImportantAppointmentCount; } appointment[] getImportantAppointments() { } appointment[] getAllAppointments() { } */ void loadFromFile() { ifstream iStream("file.ext", ios::binary); if (!iStream) { cout << "No file"; } else { fileHeader_t fHeader; iStream.read((char*)&fHeader, sizeof(fileHeader_t)); if (fHeader.magicNumber = 0xDEADBEAF) { appointments.resize(fHeader.appointmentCount); iStream.read((char*)&appointments[0], fHeader.appointmentCount * sizeof(appointment)); } } } void saveToFile() { ofstream oStream("file.ext", ios::binary); fileHeader_t fHeader; fHeader.magicNumber = 0xDEADBEAF; fHeader.appointmentCount = appointments.size(); oStream.write((char*)&fHeader, sizeof(fileHeader_t)); oStream.write((char*)&appointments[0], sizeof(appointment) * appointments.size()); } //vector<appointment> appointments; private: vector<appointment> appointments; string calCurrentDate; string calCurrentTime; typedef struct fileHeader_s { DWORD magicNumber; size_t appointmentCount; }fileHeader_t; };
I am getting thew following errors when calling the loadFromFile() method.
[BCC32 Warning] File1.cpp(185): W8060 Possibly incorrect assignment [ILINK32 Error] Error: Unresolved external 'appointment::appointment()' referenced from \PROFILES.SOIT.LOCAL\HOMES$\SIMON.CANNING\MY DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG\FILE1.OBJ [ILINK32 Error] Error: Unable to perform link
I understand that this happens because of the constructor call. Can I please have some advice on how to fix this issue?