Khm, pa pazi, možeš da koristiš one 'stare' klasične C-ovske funkcije za otvaranje datoteka i snimanje u tekstualnom režimu, a možeš i onako 'kako je rečeno'.
Prvo, ako imaš neku svoju klasu(strukturu) koju želiš da sačuvaš moraš joj dati mogućnost da se 'serializuje'. To možeš uraditi na sledeći način:
Code:
class CSlog : public CObject
{
DECLARE_SERIAL(CSlog)
public:
virtual void Serialize(CArchive &ar);
CTip_promenljive1 Ime_Promenljive1;
// itd
// (...)
}
(Objasniću posle zašto je potrebno da tvoja klasa bude izvedena iz CObject...)
Ovo ti je telo funkcije Serialize(CArchive &ar)
Code:
IMPLEMENT_SERIAL(CSlog, CObject, 1)
void CSlog::Serialize(CArchive &ar) {
if (ar.IsLoading())
{
ar >> Ime_Promenljive1;
ar >> Ime_Promenljive2;
// itd.
}
else
{
ar << Ime_Promenljive1;
ar << Ime_Promenljive2;
// itd...
}
}
E, tu nije kraj. Sledeće što bi trebalo da uradiš jeste da izvedeš klasu iz CMapStringToOb. To ti je kao kolekcija ovih tvojih slogova (u zavisnosti od toga šta radiš, lako broj tih slogova može da ti naraste na 10000 i mnogo mnogo više, pa je bolje da ih sve strpaš u kolekciju i snimiš odjednom). Evo kako to da odradiš:
Code:
class CKoktelCollection : public CMapStringToOb
{
public:
CSlogCollection(int nBlockSize = 10)
: CMapStringToOb(nBlockSize) {};
};
typedef CTypedPtrMap<CSlogCollection, CString /* KEY */ , CSlog*>TSlogCollection;
To je što se toga tiče, onda u klasama gde to snimaš (da li su u pitanju prozori ili dijalozi) deklarišeš promenljivu:
TSlogCollection m_SlogCollection;
Zatim preklopiš serialize funkciju tog prozora (ili dijaloga) da izgleda ovako nekako:
Code:
void CMojProzorIliDijalog::Serialize(CArchive &ar)
{
m_SlogCollection.Serialize(ar);
if (ar.IsStoring())
{
}
else
{
}
}
I pored toga evo ti funkcije LoadRecords(); i SaveRecords(); koje takođe ugrađuješ u svoj prozor/dijalog
Code:
void CMojProzorIliDijalog::LoadRecords()
{
if (CanSerialize())
{
CFile file;
CFileException fe;
if (file.Open(DATA_FILE, CFile::typeBinary | CFile::modeRead, &fe))
{
CArchive ar(&file, CArchive::load);
Serialize(ar);
}
}
}
void CMojProzorIliDijalog::SaveRecords()
{
BOOL bCanSave = FALSE;
UINT nFlags = CFile::typeBinary | CFile::modeWrite;
if (_access(DATA_FILE, 0))
{
nFlags |= CFile::modeCreate;
bCanSave = TRUE;
}
else
{
bCanSave = CanSerialize();
}
if (bCanSave)
{
CFile file;
CFileException fe;
if (file.Open(DATA_FILE, nFlags, &fe))
{
CArchive ar(&file, CArchive::store);
Serialize(ar);
}
}
}
U ovom kodu DATA_FILE ti je definisan u #define, ali u tvom slučaju ti ćeš to ime pokupiti iz CFileDialog...
Funkcija CanSerialize() je vrlo jednostavna.
Code:
#include "io.h"
BOOL CMojProzorIliDijalog::CanSerialize()
{
return (0 == _access(DATA_FILE, 6));
}
E sada, potrebno je pristupati članovima m_SlogCollection; Ali to nije teško. Evo u jednog konkretnog primera za pristupanje i snimanje ovih slogova...
Code:
//recimo da u tvom CSlog klasi imash CString strNaziv, i njega ću koristiti kao key:
//ovo je telo neke tvoje funkcije klase CMojProzorIli...
CSlog *pSlog = new CSlog;
m_SlogCollection.SetAt(strNaziv, pSlog);
//zatim uneseš ostale podakte u taj pSlog...
pSlog->Ime_Promenljive1 = "neki tekst ili shta ti je vetj potrebno...";
//itd
SaveRecords();
//to je za snimanje podataka, a sada za učitavanje:
//takođe telo neke funkcije one klase...
POSITION pos;
CString strKey;
CSlog *pSlog;
pos = m_SlogCollection.GetStartPosition();
while(NULL != pos)
{
m_SlogCollection.GetNextAssoc(pos, strKey, (CObject*&)pSlog); //ovde ti možda nije ni neophodno ovo (CObject*&)
if (pSlog) {
// uradi nešto sa ovim određenim unosom...
}
}
E sada, zašto CObject? Zato što je CTypedPtrMap klasa zapravo mapa pokazivača na objekte CObject klase (i klasa izvedenih iz nje). Naravno, sve ovo može da se odradi na 10001 način, ali ovako ja radim i ovo sam ti samo iskopirao funkcije iz nekog mog programa, pa ako ne možeš da se snađeš reci da ti potanko objasnim korak po korak, ili pak da ti napišem i pošaljem neki sample koji će da radi, pa da vidiš kako to radi na delu.
Ovo ti nije baš za snimanje fajlova u tekstualnom mod-u, ali možeš i to da odradiš. Pogledaj malo u MSDN-u o klasi CFile. Zaista nije teško.
Nadam se da sam pomogao.
Pozz