Auslesen einer Structur (mal was für Profis)



  • Hallo Leute habe mal wieder ein Problem.

    folgenes Problem ich schreibe daten einer Struktur in eine Datei und
    und habe mir dazu eine eigene Klasse restellt. Das fuzt auch hervorragend
    Hier der Code der Klasse

    #include "stdafx.h"
    #include "RechenoptionDlg.h"
    #include <time.h>
    
    class CDaten_Schreiben : public CDialog
    {
    
    public:
    
        typedef struct Rechendaten
        {
    
        CString Rechen_Variante;
        CString Aufgaben_Typ;
        CString Rechen_Datum;
        CString Aufgabe_Gestellt;
        CString Aufgabe_Vorschlag;
        CString Aufgabe_Loesung;
        CString Status_Loesung;
        CString Loesung_Zeit;
        CString Status_Zeitvorgabe;
        CString Zeitvorgabe_Aufgabe;
    
        }gebe_Daten;
    
        Rechendaten Daten;
    
        CString Anmeldename;
        CString Pfadanname;
    
        void Grunddaten(CString Z1_RechenVariante, CString Z1_RechenTyp, CString Z1_AufGestellt,CString Z1_AufVorschlag, CString Z1_AufLoesung, CString Z1_StatusLoesung, CString Z1_LoesungZeit,CString Z1_StatusZeitvorgabe)
        {
    
        CStdioFile datei1("C:\\RMUser.ini", CFile::modeRead);
        UpdateData(TRUE);
        datei1.ReadString(Anmeldename);
        datei1.Close();
    
        CStdioFile datei2( "C:\\RMlog.ini", CFile::modeRead );
        UpdateData( TRUE );
        datei2.ReadString( Pfadanname);
        datei2.Close();
    
        Daten.Aufgabe_Gestellt = Z1_AufGestellt;
        Daten.Aufgabe_Vorschlag = Z1_AufVorschlag;
        Daten.Rechen_Variante = Z1_RechenVariante;
        Daten.Aufgaben_Typ = Z1_RechenTyp;
    
        CTime curTime1 = CTime::GetCurrentTime();   
        Daten.Rechen_Datum.Format("%d.%d.%d",curTime1.GetDay(),curTime1.GetMonth(),curTime1.GetYear());
    
        Daten.Aufgabe_Loesung = Z1_AufLoesung;
        Daten.Status_Loesung = Z1_StatusLoesung;
        Daten.Loesung_Zeit = Z1_LoesungZeit;
        Daten.Status_Zeitvorgabe = Z1_StatusZeitvorgabe;
    //  Daten.Zeitvorgabe_Aufgabe = Z1_ZeitvorgabeAufgabe;
    
        CString Logdatei = Pfadanname + "\\" + Anmeldename + "DBank.rm1";
        CFileFind find9;
        if(find9.FindFile(Logdatei) == FALSE)
        {
            CStdioFile dateiDB(Pfadanname + "\\" + Anmeldename + "DBank.rm1",CFile::modeCreate | CFile::modeWrite);
            dateiDB.SeekToEnd();
            dateiDB.Close();
            MessageBox("Protokolldatei wurde neu erstellt","Systemnachricht",64);
        }
    
            CStdioFile dateiDB(Pfadanname + "\\" + Anmeldename + "DBank.rm1",CFile::modeWrite | CFile::modeNoTruncate);
            dateiDB.SeekToEnd();
    
            dateiDB.WriteString(Daten.Rechen_Variante+Daten.Aufgaben_Typ+Daten.Rechen_Datum+Daten.Aufgabe_Gestellt+Daten.Aufgabe_Vorschlag + Daten.Aufgabe_Loesung + Daten.Status_Loesung + Daten.Loesung_Zeit + Daten.Status_Zeitvorgabe + "\n");
    
            dateiDB.Close();
    
        }
    
    };
    

    in der Datei steht dann etwa so was

    AdditionA+B=?15.11.20023+6=?3+6=3+6+9nein00:00.3 minINAKTIV
    AdditionA+B=?15.11.20023+10=?3+10=3+10+13nein00:00.4 minINAKTIV
    AdditionA+B=?15.11.20027+1=?7+1=7+1+8nein00:00.3 minINAKTIV
    Addition?+B=C16.11.2002?+1=54+1=54+1+5ja00:02.6 minINAKTIV
    Addition?+B=C16.11.2002?+6=1634+6=1610+6+16nein00:02.7 minINAKTIV
    Addition?+B=C16.11.2002?+9=112+9=112+9+11ja00:03.4 minINAKTIV
    AdditionA+?=C16.11.20024+?=84+4=84+4+8ja00:03.5 min15:0 sec
    AdditionA+?=C16.11.20025+?=135+4=135+8+13nein00:02.9 min15:0 sec
    AdditionA+?=C16.11.20026+?=146+8=146+8+14ja00:05.1 min15:0 sec
    ------------------------------------------------------------

    Was will ich nun tun Ich möchte die Daten in einer Strukturansicht
    anzeigen.
    Wie ich das mit Datenbanken mache ist nicht das problem aber wie mache
    ich das mit struckturen

    wie kann ich die Daten in einer Struktur filtern

    Anzeige soll so aussehen

    Addition
    A+B=?
    …..
    ?+B=C
    ….
    A+?=C
    ….
    Subtraktion
    .
    .
    .

    Ich habe nicht den gerinsten plan wie ich auf die Daten zugreifen könnte
    und wie ich sie Filtere.

    Gleich vorne weg ich benutze mit absicht keine Datenbank da die
    Dateien vom System erstellt werden und es nicht
    sicher ist das die Benutzer alle ein DB Programm auf den Rechner haben.

    Ich brauche keine komplette lösung sondern nur ein Denkanstoß oder
    ein kleines Beispiel

    Danke Vossy



  • typedef struct Rechendaten
    {

    CString Rechen_Variante;
    CString Aufgaben_Typ;
    CString Rechen_Datum;
    CString Aufgabe_Gestellt;
    CString Aufgabe_Vorschlag;
    CString Aufgabe_Loesung;
    CString Status_Loesung;
    CString Loesung_Zeit;
    CString Status_Zeitvorgabe;
    CString Zeitvorgabe_Aufgabe;

    }gebe_Daten;

    Laut deinem Programm muss doch "gebe_Daten" in "Daten" umgeändert werden?
    Sorry, dass ich dir nicht weiter helfen konnte.



  • Du müsstest in der Datei zwischen den Einzeldaten Trennzeichen einbauen.

    Devil



  • das auslesen in eine struktur ist so nicht möglich, weil CStrings immer ne variable Länge haben. Entweder mit festen char arrays arbeiten oder anders einlesen



  • Das kann ja nicht sein da ja eine Doppelte Difenition entstehen würde

    typedef struct Rechendaten
    {

    CString Rechen_Variante;
    CString Aufgaben_Typ;
    CString Rechen_Datum;
    CString Aufgabe_Gestellt;
    CString Aufgabe_Vorschlag;
    CString Aufgabe_Loesung;
    CString Status_Loesung;
    CString Loesung_Zeit;
    CString Status_Zeitvorgabe;
    CString Zeitvorgabe_Aufgabe;

    }gebe_Daten;// kann auch entfallen

    Rechendaten Daten;//neudeffenition der Struct

    Macht nichts das du mir nicht helfen kannst
    ist auch etwas anspruchsvoller

    bin mitlerweilen etwas weiter

    mFile.Open(Pfadannahme111 + "\\" + Anmeldename111 + "DBank.rm1", CFile::modeRead,NULL );
    
            while (mFile.ReadString(Daten_lesen.Rechen_Variante))
            {
    
            MessageBox(Daten_lesen.Rechen_Variante);
            aab++;
            }
    
    mFile.Close();
    

    Das Auslesen geht jetzt aber es wird immer die gesammte Zeile Übergeben

    z.B. AdditionA+B=?15.11.20023+6=?3+6=3+6+9nein00:00.3 minINAKTIV

    es sollte aber nur Addition übergeben werden.
    Wieso kann ich nicht auf einm einzelnes Struc element zugreifen

    Vossy



  • Du musst den String parsen.
    Füge zwischen den einzelnen Elementen ambesten Trennzeichen hinzu,
    so das du sie unterscheiden kannst.

    Devil



  • Ich würde Dir XML empfehlen



  • Danke euch allen

    zu RenéG

    mit XML kenne ich mich nicht aus zuminsest noch nicht.

    zu devil81

    Das mit den Zwischenzeichen hört sich gut an und
    das habe ich auch gemacht

    Das sieht dann in der Datei so aus

    Addition'A+?=C'16.11.2002'8+?=9'8+=9'8+1=9'nein'00:00.5 min'INAKTIV'

    Das Trennzeichen ist "'"

    Jetzt meine Frage wie soll ich das am einfachsten zerschneiden

    Vossy



  • CString::Right, CString::Left, CString::Mid

    Devil



  • Ja, entweder du benutzt Trennzeichen und die CString-Funktionen, oder du verwendest ein CFile mit CArchive (die Klasse verwaltet Trennzeichen intern). XML ist in deinem Fall nicht nötig



  • Ich habe es mit trennstriche gelöst

    Danke euch allen

    Vossy


Anmelden zum Antworten