Добрый день. Пытаюсь разобраться с сериализацией в MFC . Имеются классы: | Код | class Student :public CObject // наследую от CObject { private: std::string name; CString c_name; // использую для того чтобы считать//записать данные из/в файл int age;
public: DECLARE_SERIAL( Student); // написал макрос virtual void Serialize( CArchive& archive );// переопределил функцию Student();// конструктор по умолчанию есть virtual ~Student(); Student(std::string n,int a ) : name(n),age(a) {} void setName(std::string s){ c_name = s.c_str();} virtual std::ostream & Show(std::ostream &,Student*); virtual std::istream & Enter(std::istream &,Student *); friend std::ostream & operator<<(std::ostream & ,Student *); friend std::istream & operator>>(std::istream & ,Student *); };
|
| Код | //в cpp IMPLEMENT_SERIAL( Student, CObject, 1); // написал макрос
void Student::Serialize(CArchive & archive ) { CObject::Serialize( archive ); if( archive.IsStoring() ) { Student::setName(name); archive << c_name << age; } else { archive >> c_name>>age; CT2CA pszConvertedAnsiString (c_name); std::string nu(pszConvertedAnsiString); name = nu; } }
class Groupa { private: std::vector < std::shared_ptr<Student> > group; public: void Add(S *); void Show(); void Clear(); void Read(CArchive & ar); void Write(CArchive & ar); bool isEmpty(){return group.size() == 0;}; Groupa(); ~Groupa(); };
void Groupa::Read(CArchive & ar) { Clear(); S *p; int f_size=0; ar >>f_size; // считывает какое то огромное число , не то ,что я записал в файле //дальше уже цикл неправильный for(int i=0;i<f_size;++i) { p = new S; Add(p); group[i]->Serialize(ar); } std::cout <<"Group read from file!!"<<std::endl; }
void Groupa::Write(CArchive & ar) { ar <<group.size(); for(auto Iter = group.begin();Iter!=group.end();++Iter) (*Iter)->Serialize(ar); std::cout <<"Group write in file!!"<<std::endl; }
|
Вот сама программа( пытаюсь считать из файла) : | Код | Groupa group; Student *p = new Student; cin >>p; group.Add(p); CFile f; CFileException e; TCHAR* pszFileName = _T("s.txt"); if(!f.Open(pszFileName, CFile::modeRead, &e)) { TRACE(_T("File could not be opened %d\n"), e.m_cause); } else { CArchive archive(&f, CArchive::load); group.Read(archive); archive.Close(); f.Close(); }
|
Что я делаю неправильно , скажите пожалуйста. Отладка на фотках:
Присоединённый файл ( Кол-во скачиваний: 4 )
1.jpg 57,40 Kb
|