Vektoren und Struktur



  • Textdatei.txt
    [ABCD] ....... 28.11.2007
    [EFGH] ........ 11:42:17
    [XYWZ] ....... 5709
    [ABCD] ....... 29.11.2007
    [EFGH] ........ 15:41:17
    [XYWZ] ....... 5600
    [ABCD] ....... 30.11.2007
    [EFGH] ........ 11:42:17
    [XYWZ] ....... 1300
    .....
    ich habe so eine datei (siehe oben) , nach dem ich die datei hochlade und auslese möchte ich die gesuchte strings deren inhalte(z.B.EFGH->11:42:17)
    in m_vImport blockweise speichern , aber so wie in mein speichereDatei() funktion kann ich leider nicht blockweiße speichern.(von ABCD bis XYWZ ist ein block).

    Kann mir bitte jemand helfen . Ich möchte,dass die erste block von ABCD bis XYWZ in m_vImport[1] steht und die zweite block von ABCD bis XYWZ in m_vImport[2] steht usw...
    Ich würd mich freuen auf Ihre Hilfe.
    Vielen vielen Dank

    Meine Struktur und Vektor in Header Datei

    //Ordnung.h
    #include <vector>
    
    struct Big{
    	COleDateTime zeit;
    };
    
    typedef std::vector<Big> VBig;
    struct Import{
    
    	COleDateTime		  m_cDatum;//ABCD
    	COleDateTime   		  m_cZeitbegin;//EFGH
    	int			  m_iLaenge;//XYWZ
    	VBigm_vBig;
    };
    
    typedef std::vector<Import> VImport;
    class Ordnung  
    {
    public:
    	void speichereDatei(CString sPath);
    	VImport m_vImport;
    
    };
    

    Meine cpp datei

    // Ordnung.cpp:
    
    void Ordnung::speichereDatei(CString sPath)
    {
    
    	//--------------------------------------------------------------+
    	// 	CStdioFile objekt erstellen									!
    	//--------------------------------------------------------------+
    	CStdioFile file;
    	CString		sZeile = "";
    	CStringList zeileSet;
    	//--------------------------------------------------------------+
    	// 	Mit dem gegebenen Path (sPath) Datei öffnen					!
    	//--------------------------------------------------------------+
    	file.Open(sPath, CFile::modeRead);
    	//--------------------------------------------------------------+
    	// 	File name und die größe des Files							!
    	//--------------------------------------------------------------+
    	CString id;
    	CString info;
    	while(file.ReadString(sZeile))
    	{
    		zeileSet.AddTail(sZeile);
    		id=zeileSet.GetTail();
    		inf=zeileSet.GetTail();
    		id=id.Mid(1,4);
    		if(id=="ABCD")
    		{	
    			CString datum=searchDatainStr(inf);//Die Funktion macht irgendein operation ,damit inf bisschen verkürzt werden kann
    			dat.m_cDatum.ParseDateTime(datum);
    		}
    		else if(id=="EFGH")
    		{
    			CString time=searchDatainStr(inf);
    			dat.m_cZeitbegin.ParseDateTime(time);
    		}
    		else if(id=="XYWZ")
    		{
    
    			CString mnou=searchDatainStr(inf);
    			 dat.m_iLaenge = atoi (mnou );	
    		}
    		m_vImport.push_back(dat);
    	}
    
       file.Close();
    }
    


  • Strings werden mit einem \0 abgeschlossen.
    Wenn du mit readstring arbeitest, solltest du vorher die Datei mit einem \0 pro Zeile erstellen. Wenn du das nicht kannst ist readstring hier eher der falsche Weg und du musst deinen komplett eingelesenen readstring mit .Find("\r\n") erstmal alle Zeilenumbrüche durchsuchen und neue Einzelstrings erstellen.



  • ReadString
    Reads a single line of text.

    also braucht da am ende jeder Zeile kein '\0' zu sein. Sein Problem ist das er immer 3 Zeilen in ein m_vImport Packen will. Das kann man machen in dem man einfach immer 3 Zeilen liesst und dann die daten in den Vector packt.

    mal so als Idee

    CString id;
        CString info;
        while(file.ReadString(sZeile))
        {
            zeileSet.AddTail(sZeile);
            id=zeileSet.GetTail();
            inf=zeileSet.GetTail();
            id=id.Mid(1,4);
            if(id=="ABCD")
            {   
                CString datum=searchDatainStr(inf);//Die Funktion macht irgendein operation ,damit inf bisschen verkürzt werden kann
                dat.m_cDatum.ParseDateTime(datum);
            }
            else if(id=="EFGH")
            {
                CString time=searchDatainStr(inf);
                dat.m_cZeitbegin.ParseDateTime(time);
            }
            else if(id=="XYWZ")
            {
    
                CString mnou=searchDatainStr(inf);
                 dat.m_iLaenge = atoi (mnou );
                m_vImport.push_back(dat);        //Daten Werten erst in den Vector geschrieben wenn das letzte gelesen wurde  
            }
        }
    

    macht halt nur Sinn, wenn die reihenfolge fest ist und nicht verändert wird. alternativ, kann man auch in jedem if-Zeig nen flag setzen und wenn alle vollständig sind, den Vector schreiben. Oder erst 3 Zeilen lesen, dann zuordnen und dann schreiben. oder noch mal das Dateivormat überarbeiten falls möglich und die Bereiche erkennbar trennen. Also Lösungen gibt es dafür mehr als genug.



  • Danke 😉


Anmelden zum Antworten