Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Liste Speichern Öffnen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
19.05.2005, 11:06 Uhr
GuenniAtWork



Noch ne Frage (schon die zweite Heute).

Ich habe eine Liste (CList), die eine unbestimmte Anzahl von Elementen eines selbstdefinierten Datentyps enthält.
Diese Liste würde ich gerne in einer Datei speichern, bzw. aus einer Datei inportieren.
Welche möglichkeiten gibt es, um das zu realisieren?
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.05.2005, 11:38 Uhr
Th



Für binäre Daten kannst du CFile benutzen, ansonsten für Textdateien direkt die C++ Klassen ofstream und ifstream aus <fstream>.
Bei dynamischen Daten am besten zuerst die Anzahl abspeichern und danach die einzelnen Elemente der Liste, so daß beim Einlesen sofort der Speicher alloziert werden kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.05.2005, 11:47 Uhr
mmc20
puss in boots


hi, oder du benutzt statt der liste ein CObArray, und eine daten-klasse statt des selbstdefinierten datentyps, dann kannst du es (ganz einfach) serialisieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.05.2005, 11:51 Uhr
GuenniAtWork



Gibt es noch weitere Möglichkeiten.
Ich habe mal was von Serialize gelesen aber nicht so richtig verstanden.
Oder geht das sowiso nur mit Klassen??
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.05.2005, 11:54 Uhr
GuenniAtWork



@mmc20: Ich möchte aber miene Eigenen Datentypen behalten. und CList ist auch ganz OK.

Also scheint Serialisieren nicht zu funktionieren.
Da wird mir wohl nichts andrees übrigbleiben als mit fstream zu arbeiten. Oder?
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.05.2005, 13:07 Uhr
mmc20
puss in boots


naja, die serialisierung ist jetzt nicht soooo kompliziert, hier mal ein "einfaches" beispiel

DatenKlasse:

C++:
class CWzData : public CObject
{
    DECLARE_SERIAL (CWzData)
public:
    CWzData();
    CWzData::CWzData (const CWzData& cop);
    void Serialize(CArchive& ar);
// hier die Datenelemente
    CString     sText;
    double    dEineZahl;
};

IMPLEMENT_SERIAL (CWzData, CObject, 1)

CWzData::CWzData() // ctor
{
}

CWzData::CWzData (const CWzData& cop) // kopier-ctor
{
    this->dEineZahl = cop.dEineZahl;
    this->sText = cop.sText;
}

void CWzData::Serialize(CArchive &ar)
{
    CObject::Serialize( ar );

    if ( ar.IsStoring() )
        ar << sText << dEineZahl;
    else
        ar >> sText >> dEineZahl;
}


member der liste

C++:
    CObArray m_wzListe;


das laden/speichern der datei ist dann einfach

C++:
// laden
    CFile file;
    if ( file.Open( "C:\\Path\\filename.ext", CFile::modeRead ) ) {
        CArchive ar( &file, CArchive::load|CArchive::bNoFlushOnDelete );
        m_wzListe.Serialize( ar );
    } else
        MessageBox( "Daten konten nicht gelesen werden.", " Datei laden", MB_ICONERROR|MB_OK );
    file.Close();


für CObArray natürlich noch "#include <afxcoll.h>"

Dieser Post wurde am 19.05.2005 um 13:21 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.05.2005, 13:56 Uhr
GuenniAtWork



Mein Problem ist die Umdetzung auf meine Liste, die diese Struktur hat:


C++:
struct TRunApp
{
    CString sAppPath;
    CString sAppParam;
};

struct TFiles
{
    int        iCopyDel;
    CString    sFile;
    CString    sFileDestination;
};

struct TEnvVar
{
    int        iSysUserVar;
    CString    sVarName;
    CString    sVarValue;
};
struct TService
{
    CString sServiceName;
    int        iStopDel;
};

struct TLink
{
    CString sName;
    CString sTargetDestination;
    CString sTargetFile;
    CString sHotKey;
    CString sDescription;
    int        iWindStyle;
};

struct TJob
{
    CString        sJobName;
    int        iJobID;
    TRunApp        tRunApp;
    TFiles        tFiles;
    TEnvVar        tEnvVar;
    TService                 tService;
    TLink        tLink;
};

extern CList<TJob,TJob&> JobList; //Meine Liste



Oder ist es doch kein Problem?
Ich habe jedenfalls keine Ahnung wie ich das anstellen soll.

Und wie siehts, wenn ich das mit CFile (oder fsteam) machen würde?
--
Gruß GuenniAtWork

Dieser Post wurde am 19.05.2005 um 14:11 Uhr von GuenniAtWork editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.05.2005, 00:20 Uhr
mmc20
puss in boots


also, auf dein projekt umgesetzt müsste es so aussehen...

C++:
/////////////////////////////////////////////////////////////////////////////
// Daten-Structs

struct TRunApp {
    CString sAppPath;
    CString sAppParam;
};

struct TFiles {
    int iCopyDel;
    CString sFile;
    CString sFileDestination;
};

struct TEnvVar {
    int iSysUserVar;
    CString sVarName;
    CString sVarValue;
};
struct TService {
    CString sServiceName;
    int        iStopDel;
};

struct TLink {
    CString sName;
    CString sTargetDestination;
    CString sTargetFile;
    CString sHotKey;
    CString sDescription;
    int iWindStyle;
};

/////////////////////////////////////////////////////////////////////////////
// Daten-Klasse

class TJob : public CObject
{
    DECLARE_SERIAL (TJob)
public:
    TJob();
    TJob::TJob (const TJob& cop);
    void Serialize(CArchive& ar);
// hier die Datenelemente
    CString sJobName;
    int iJobID;
    TRunApp tRunApp;
    TFiles tFiles;
    TEnvVar tEnvVar;
    TService tService;
    TLink tLink;
};

IMPLEMENT_SERIAL (TJob, CObject, 1)

TJob::TJob() // ctor
{
}

TJob::TJob (const TJob& cop) // kopier-ctor
{
    this->iJobID = cop.iJobID;
    this->sJobName = cop.sJobName;
    this->tRunApp = cop.tRunApp;
    this->tFiles = cop.tFiles;
    this->tEnvVar = cop.tEnvVar;
    this->tService = cop.tService;
    this->tLink = cop.tLink;
}

void TJob::Serialize(CArchive &ar)
{
    CObject::Serialize( ar );

    if ( ar.IsStoring() ) {
        ar << sJobName << iJobID;
        ar << tRunApp.sAppParam << tRunApp.sAppPath;
        ar << tFiles.iCopyDel << tFiles.sFile << tFiles.sFileDestination;
        ar << tEnvVar.iSysUserVar << tEnvVar.sVarName << tEnvVar.sVarValue;
        ar << tService.iStopDel << tService.sServiceName;
        ar << tLink.iWindStyle << tLink.sDescription << tLink.sHotKey << tLink.sName << tLink.sTargetDestination << tLink.sTargetFile;
    } else {
        ar >> sJobName >> iJobID;
        ar >> tRunApp.sAppParam >> tRunApp.sAppPath;
        ar >> tFiles.iCopyDel >> tFiles.sFile >> tFiles.sFileDestination;
        ar >> tEnvVar.iSysUserVar >> tEnvVar.sVarName >> tEnvVar.sVarValue;
        ar >> tService.iStopDel >> tService.sServiceName;
        ar >> tLink.iWindStyle >> tLink.sDescription >> tLink.sHotKey >> tLink.sName >> tLink.sTargetDestination >> tLink.sTargetFile;
    }
}


und ein objekt der liste hinzufügen...

C++:
// neues anlegen
    TJob* tmp = new TJob;
// mit daten füllen
    tmp->tService.sServiceName = "test";
// und der "liste" hinzufügen
    try { m_Liste.Add( tmp ); }
    catch ( CMemoryException* perr ) {
        AfxMessageBox("LOL - Kein Speicher zur Verfügung.", MB_ICONSTOP | MB_OK);
        if ( tmp ) {
            delete tmp;
            tmp = NULL;
        }
        perr->Delete();
    }


das war's schon.
hier noch der code zum speichern (laden steht ja schon oben)

C++:
    CFile file;
    if ( file.Open( m_sFileName, CFile::modeCreate | CFile::modeWrite ) ) {
        CArchive ar( &file, CArchive::store );
// hier könnte man noch ne versionsnummer speichern,
// muss natürlich beim laden auch als erstes gelsen werden... ar >> m_iVersion;
        ar << m_iVersion;
        m_Liste.Serialize( ar );
    } else
        MessageBox( "Daten konnten (warum auch immer) nicht gespeichert werden.", " Datei speichern", MB_ICONERROR|MB_OK );
    file.Close();


...fertig !

Dieser Post wurde am 20.05.2005 um 00:22 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.05.2005, 10:27 Uhr
GuenniAtWork



Hi,

@mmc20:erstmal vielen vielen Dank für deine Mühe!! Hat mir sehr geholfen.

Aber welchen Datentyp hat m_Liste. Mit CList funzt es nicht, weil der = Operstor nicht definiert ist. Hab ihn dann überladen und gehoft dass es dan funktioniert, aber fehlanzeige.
Oder muß ich mir ne eigene Liste basteln?
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.05.2005, 12:05 Uhr
mmc20
puss in boots


hi, hätt ich fast vergessen...

C++:
#include <afxcoll.h>

// member
CObArray m_Liste;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: