tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1244
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    LaciFux LaciFux ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    10
    hallo,

    bräuchte mal eine möglichkeit in der ich mithilfe von c++ (vs2005) lanfristig daten zu meinem programm speichern kann. am besten in einer datei, diese datei aber nicht unbedingt in klartext zu lesen sein soll (wie z.b. ini datei). ebenfalls soll keine datenbank genutzt werden, da dies wiederum zu viel aufwand wäre (xamp usw. + sql programmierung). habe das etwas von "records" gehört und in der mfc gibt es auch eine crecordset klasse. in wie fern kann ich das nutzen und/oder gibt es eventuell etwas besseres.

    vielen dank im voraus... lacifux
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Die CRecordset-Klasse wird mit Datenbanken verwendet, ist also nichts für dich, da du keine verwenden willst.
    Du könnstest dir stattdessen mal die Klasse CArchive anschauen, mit der du Objekte serialisieren kannst. Da die Daten in binärer Form gespeichert werden, sind die Dateien auch nicht mehr ohne weiteres lesbar.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    LaciFux LaciFux ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    10
    Hatte ich schon nachgesehen. Mein Problem ist, dass ich die Daten strukturiert reinschreiben und auch wieder lesen muss (wie in Ini Datei). Eine Ini Datei wäre prinzipiell ok, allerdings reichen mit die Möglichkeiten zur Datenkapselung nicht aus (Section, Key, Value).
    In CArchive habe ich solche Möglichkeiten zur Strukturierung nicht erkennen können. XML hatte ich kurz überlegt, bietet aber auch keine einfache Möglichkeit zur Codierung der Daten. Irgendetwas muss es doch da geben. Mir fehlt sowas wie eine Ini Datei, in welcher ich eine Section noch weiter unterteilen kann als nur in Key.

    Vielen Dank für die Antwort. Ich beschäftige mich nochmal mit CArchive. Vielleicht gibt es da ja eine Lösung.

    LaciFux
     

  4. #4
    LaciFux LaciFux ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    10
    XML kann man aber schon als so eine Art Erweiterung von INI Dateien nutzen. Jedenfalls kann man in einer XML Datei verschiedene Elemente mit Attributen anlegen. Kann mir vielleicht jemand etwas genaueres dazu sagen?!

    LaciFux
     

  5. #5
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Noch mal zum Thema CArchive: Da du ja ganze Objekte serialisieren kannst, musst du eine gewünschte Struktur in diese Objekte packen. Ist eigentlich recht easy, allerdings nicht besonders portabel, da es nur mit der MFC funktioniert.

    XML halte ich für eine gute Lösung, da man die Daten sehr viel besser strukturieren kann, als etwa mit einer INI-Datei. Ansonsten weiß ich nicht, was man Genaueres dazu sagen soll. Schaue dir einfach mal den Aufbau einer beliebigen XML-Datei an, dann dürfte das Prinzip schon klar werden. Allerdings sind XML-Dateien wieder Textdateien, womit sie dann auch wieder im Klartext lesbar wären.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  6. #6
    LaciFux LaciFux ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    10
    Das mit CArchive hört sich gut an. Wenn ich das so verstandenhabe:

    1. Anlegen einer Struktur, welche meiner Vorstellung entspricht:

    typedef struct{
    int nID;
    CString m_Name;
    CString m_Address;
    } STORAGE;

    2. Object erzeugen

    STORAGE myStorage;

    3. Instanz von STORAGE archivieren

    CArchive myArchive(..., myStorage, ...);

    Ist das so ungefähr gemeint? Programmiere übrigens MFC aber erst seit gut einem Monat und habe mich von daher noch nicht so gut mit der Dokument / Ansicht Struktur vertraut gemacht. Falls das so wie oben funktionieren sollte, ist noch die Frage wie ich das lesen kann, wenn meine Member (z.B. die CString Member) teilweise variable Länge haben. Weiß nicht genau wie der sizof Operator (z.B. sizeof(CString)) macht.

    Hoffe erschlage Dich nicht MCoder. Vielleicht kennst Du Dich ja damit aus!

    LaciFux
     

  7. #7
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Die serialisierbaren Klassen müssen entsprechend vorbereitet werden. Ich hoffe, anhand des kleinen Beispiels wird das einigermaßen klar. Wichtig ist Ableitung von der Klasse CObject und die Verwendung der Makros DECLARE_SERIAL und IMPLEMENT_SERIAL.
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    //////////////////////////////////////////////////////////////////////////
    // Serialisierbare Klasse
     
    class MyData : public CObject
    {
    public:
        CString m_str;
        int     m_nNumber;
        double  m_dDouble;
     
        virtual void Serialize( CArchive& ar )
        {
            if( ar.IsStoring() )
            {
                ar << m_str;
                ar << m_nNumber;
                ar << m_dDouble;
            }
            else
            {
                ar >> m_str;
                ar >> m_nNumber;
                ar >> m_dDouble;
            }
        }
     
        DECLARE_SERIAL(MyData)
    };

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    IMPLEMENT_SERIAL(MyData, CObject, 1)
     
    //////////////////////////////////////////////////////////////////////////
    // Schreiben
     
    CFile fileOut;
     
    if( fileOut.Open(_T("c:\\temp\\mydata.dat"), CFile::modeCreate | CFile::modeWrite) )
    {
        CArchive arOut(&fileOut, CArchive::store);
     
        MyData mydata;
        mydata.m_str     = _T("String");
        mydata.m_nNumber = 1;
        mydata.m_dDouble = 2.2;
     
        mydata.Serialize(arOut);
        arOut.Flush();
     
        fileOut.Close();
    }
     
    //////////////////////////////////////////////////////////////////////////
    // Lesen
     
    CFile fileIn;
     
    if( fileIn.Open(_T("c:\\temp\\mydata.dat"), CFile::modeRead) )
    {
        CArchive arIn(&fileIn, CArchive::load);
        
        MyData mydata;
        mydata.Serialize(arIn);
        arIn.Flush();
     
        fileIn.Close();
     
        cout << (LPCTSTR)mydata.m_str << endl
             << mydata.m_nNumber      << endl
             << mydata.m_dDouble      << endl;
    }
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  8. #8
    LaciFux LaciFux ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    10
    Ich danke Dir wirklich MCoder für Deine Zeit und Bemühen. Werde Deine Variante testen und hoffe oder denke das sie funktionieren wird. Hätte nur noch eine kleine Frage bezüglich der Daten im "Archiv". Sind diese persistent, also bleiben sie auch nach Programmende im Festplattenspeicher erhalten und können beim nächsten Aufruf genutzt werden?! Vielleicht interessieren sich ja auch noch mehr User für das Thema.

    Viele Grüße und besten Dank an Dich...

    LaciFux
     

  9. #9
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Die Daten werden ja in eine Datei geschrieben (mydata.dat im Beispiel) und sind damit natürlich persistent.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

Ähnliche Themen

  1. Script und Serverbelastung, mit oder ohne Mysql Datenbank?
    Von Danielo30 im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 31.10.08, 14:18
  2. Antworten: 5
    Letzter Beitrag: 09.07.08, 20:09
  3. Antworten: 1
    Letzter Beitrag: 19.09.07, 11:45
  4. Länder in Array oder Datenbank speichern?
    Von DeeJay-Luke im Forum PHP
    Antworten: 4
    Letzter Beitrag: 13.12.06, 15:17
  5. Data Grid OHNE Datenbank speichern
    Von codeman im Forum .NET Datenverwaltung
    Antworten: 5
    Letzter Beitrag: 26.06.06, 13:47