| | |
Writing Derived Objects to files
Please support our C++ advertiser: Intel Parallel Studio Home
Thread Solved |
hello all
i want to know the proplem with this program
and first ........ can i write a string object to a file normally like other objects ??
this is the code ......the program writes the file but it can't read it again
i want to know the proplem with this program
and first ........ can i write a string object to a file normally like other objects ??
this is the code ......the program writes the file but it can't read it again
cpp Syntax (Toggle Plain Text)
#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; enum ClassType { STUDENT, PROF }; class person { protected: int id; string name; static vector<person*> arr; public: person() : id(0), name("") { } virtual void GetData() { cout << "ID:"; cin >> id; cout << "Name:"; cin >> name; } virtual void ShowData() { cout << "ID:" << id << "\nName:" << name; } virtual ClassType GetType(); static void Add(); static void ShowAll(); static void Save(); static void Load(); }; vector<person*> person::arr; class prof : public person { protected: int students; int years; public: prof() { person(); students = 0; years = 0; } void GetData() { person::GetData(); cout << "Students No.:"; cin >> students; cout << "Years No.:"; cin >> years; } void ShowData() { person::ShowData(); cout << "\nStudents No.:" << students << "\nYears No.:" << years << endl; } }; class student : public person { protected: int AVGGrade; int year; public: student() { person(); AVGGrade = 1; year = 1; } void GetData() { person::GetData(); cout << "Student Grade.:"; cin >> AVGGrade; cout << "Year No.:"; cin >> year; } void ShowData() { person::ShowData(); cout << "\nStudent AVGG.:" << AVGGrade << "\nYear No.:" << year << endl; } }; ClassType person::GetType() { if (typeid (*this) == typeid (prof)) return PROF; else if (typeid (*this) == typeid (student)) return STUDENT; } void person::Add() { char c; cout << "p for prof and s for student:"; cin >> c; person *ptr; switch (c) { case 'p': ptr = new prof; arr.push_back(ptr); break; case 's': ptr = new student; arr.push_back(ptr); } (arr.back())->GetData(); } void person::ShowAll() { for (int i = 0; i < arr.size(); i++) arr[i]->ShowData(); } void person::Save() { ofstream file("DATA.bin", ios::binary | ios::trunc); ClassType CurrentObj; int size; for (int i = 0; i < arr.size(); i++) { CurrentObj = arr[i]->GetType(); //cout << "\nH1\n"; file.write(reinterpret_cast<char*> (&CurrentObj), sizeof (ClassType)); //cout << "\nH2\n"; switch (CurrentObj) { case PROF: size = sizeof (prof); break; case STUDENT: size = sizeof (student); } file.write(reinterpret_cast<char*> (arr[i]), size); switch (CurrentObj) { case PROF: cout << "\nI Wrote " << size << " Of Type Prof"; break; case STUDENT: cout << "\nI Wrote " << size << " Of Type Student"; } } } void person::Load() { ifstream file("DATA.bin", ios::binary); ClassType CurrentObj; person *TempObj; while (file) { file.read(reinterpret_cast<char*> (&CurrentObj), sizeof (ClassType)); if (CurrentObj == PROF) { TempObj = new prof; cout << "\nReading Prof"; file.read(reinterpret_cast<char*> (TempObj), sizeof (prof)); cout << "\nProf Was Read"; } else if (CurrentObj == STUDENT) { TempObj = new student; cout << "\nReading Student"; file.read(reinterpret_cast<char*> (TempObj), sizeof (student)); cout << "\nStudent Was Read\n\n"; } TempObj->ShowData(); } system("pause"); } int main(int argc, char* argv[]) { char c; cin >> c; switch (c) { case 'a': person::Add(); person::Add(); person::Save(); break; case 'l': person::Load(); } //person::Add(); //person::Add(); //person::Add(); //person::Save(); //perosn::Load(); //person::ShowAll(); return 0; }
Last edited by TeCNoYoTTa; Jul 4th, 2008 at 5:08 am.
Using read and write to serialize your objects is generally a bad idea. At the risk of being too vague, I'll distill all of my experience into one piece of advice for your convenience:
When you want to serialize an object manually, convert each of the fields to a string, format them as desired, and then write the string to a file. When you want to deserialize an object manually, read the string from your file, parse the string in a constructor, and populate the data members.
In code form, such a solution would look like this:
This way you don't have to know the POD type rules, you don't have to worry about what's undefined behavior and what isn't, and you retain maximum portability.
When you want to serialize an object manually, convert each of the fields to a string, format them as desired, and then write the string to a file. When you want to deserialize an object manually, read the string from your file, parse the string in a constructor, and populate the data members.
In code form, such a solution would look like this:
C++ Syntax (Toggle Plain Text)
#include <sstream> #include <string> #include <vector> class student { public: std::string name; std::vector<std::string> classes; std::vector<int> grades; public: student() {} student ( const std::string& serialized ) { std::stringstream src ( serialized ); std::string class_name; int grade; // No error checking std::getline ( src, name, '|' ); while ( std::getline ( src, class_name, '|' ) ) { classes.push_back( class_name ); src>> grade; grades.push_back ( grade ); } } public: std::string serialize ( std::ostream& out ) { // Assume grades and classes are parallel // No error checking std::stringstream serialized; serialized<< name <<'|'; std::vector<std::string>::size_type i; for ( i = 0; i < classes.size(); i++ ) { if ( i != 0 ) serialized<<'|'; serialized<< classes[i] <<'|'<< grades[i]; } out<< serialized.str(); return serialized.str(); } };
I'm here to prove you wrong.
![]() |
Similar Threads
- Differences Between Java and C/C++ (C++)
- fstream Tutorial (C++)
- C++ Books (C++)
Other Threads in the C++ Forum
- Previous Thread: Find the C++ code
- Next Thread: quick question: how to 'null' blocks of an unsigned char array
| Thread Tools | Search this Thread |
api array based beginner binary bitmap c++ c/c++ calculator char char* class classes coding compile compiler console conversion convert count data database delete desktop developer directshow dll dynamiccharacterarray email encryption error file forms fstream function functions game getline google graph homeworkhelper iamthwee ifstream input int integer java lib linkedlist linux list loop looping loops map math matrix memory multiple news node number numbertoword output parameter pointer problem program programming project proxy python random read recursion recursive reference return rpg sorting string strings struct template templates test text tree unix url vector video visual visualstudio win32 windows winsock word wordfrequency wxwidgets






