Problem mit TFileStream



  • Hallo,

    mein Problem ist die Daten aus einer Datei zu lesen mit TFileStream.

    gespeichert wird so...

    struct data
    {
    	int iFirstDim;
    	int iSecDim;
    };
    
    Daten = new data; // Neues Datenstruktur-Objekt
    TFileStream *Datei = new TFileStream("datafile.dat", fmCreate);
    
    int i = 0;
    
    vector< vector<bool> >::iterator it1 = vCheckBoxArray.begin(), end1 = vCheckBoxArray.end();
    for( ; it1!=end1; ++it1)
    {
    		int j = 0;
    
    		vector<bool>::iterator it2 = it1->begin(), end2 = it1->end();
    		for( ;it2!=end2; ++it2)
    		{
    			if (vCheckBoxArray[i][j]) {
    				Daten->iFirstDim = i;
    				Daten->iSecDim = j;
    				Datei->Write(Daten, sizeof(data)); // struct "Daten" in die Datei schreiben
    			}
    		j++;
    		}
    i++;
    }
    

    Das läuft soweit.

    Da ja mehrere Daten gespeichert werden möchte ich die ja auch auslesen.
    Nur er liest mir immer nur ein Datensatz aus.

    Daten = new data;
    TFileStream *Datei = new TFileStream("datafile.dat", fmOpenRead);
    
    	Datei->Seek(0, soFromBeginning);
    	// Daten aus der Datei in das struct "Daten" einlesen
    	Datei->Read(Daten, sizeof(data));
    
    while (Datei->Position <= Datei->Size) {
    	Memo1->Lines->Add(AnsiString(Daten->iFirstDim));
    	Memo1->Lines->Add(AnsiString(Daten->iSecDim));
    	Datei->Seek(int(sizeof(data)), soFromCurrent);
    	Datei->Read(Daten, sizeof(data));
    
    	 }
    

    Und wen er doch z.B. 2 Datensätze ausliest, ist der 2. Datensatz genau wie der erste 😞

    In mom weiß ich nicht mehr weiter. Ist auch das erste mal das ich mich damit Beschäftige.



  • Habe es selber hin bekommen 😉

    Memo1->Clear();
    
    Daten = new data;
    		TFileStream *Datei = new TFileStream("datafile.dat", fmOpenRead);
    
    		 int iCount = Datei->Size / sizeof(data);
    		 Datei->Position = 0;
    
    			for (int i = 0; i < iCount; i++) {
    				if (Datei->Position == 0)
    					Datei->Seek(0, soFromBeginning);
    				else
    					Datei->Seek(int(i * sizeof(data)), soFromBeginning);
    
    				Datei->Read(Daten, sizeof(data));
    
    				Memo1->Lines->Add(AnsiString(Daten->iFirstDim));
    				Memo1->Lines->Add(AnsiString(Daten->iSecDim));
    		 }
    
    		delete Daten;
    		delete Datei;
    


  • Warum erzeugst du Daten mit new? Auf dem Stack hätte doch gereicht.



  • Bzw. ein Smartpointer für TMemoryStream .

    Und warum benutzt du AnsiString und nicht einfach String ?



  • Warum erzeugst du Daten mit new? Auf dem Stack hätte doch gereicht.

    Habe ich keine Ahnung von 😞 das habe ich im INet so gefunden.

    Und warum benutzt du AnsiString und nicht einfach String?

    Ja hmm weiß ich auch nicht so recht. Ich denke mal das String besser ist.
    Gelesen habe ich auch mal das AnsiString zuende geht.



  • Versuche so selten wie möglich direkt new/delete zu verwenden. Es gibt in C++ viele Möglichkeiten das zu vermeiden.
    In deinem Fall kann man das hier:

    Daten = new data; 
    TFileStream *Datei = new TFileStream("datafile.dat", fmOpenRead);
    

    durch das hier :

    data Daten; // klein geschriebene Typen sind recht ungewöhnlich, meistens mit großem Anfangsbuchstaben 
    std::auto_ptr<TFileStream> Datei(new TFileStream("datafile.dat", fmOpenRead));
    

    ersetzen. Dann braucht man in beiden Fällen kein delete mehr.



  • Rave173 schrieb:

    Habe ich keine Ahnung von 😞 das habe ich im INet so gefunden.

    Ganz schlechte Angewohnheit. Hast du nicht den Anspruch, alles, was du in deinen eigenen Programmcode übernimmst, auch zu verstehen? Das macht den Unterschied zwischen Pfuschen und Programmieren aus.

    Rave173 schrieb:

    Gelesen habe ich auch mal das AnsiString zuende geht.

    Delphi unterstützt keinen AnsiString für mobile Plattformen (iOS, Android), sondern nur String . C++Builder unterstützt eine reduzierte Form von AnsiString . Unter Windows werden alle Stringtypen weiterhin unterstützt.

    Der einzig verbleibende Zweck von AnsiString ist die Interaktion mit altem Code, der noch ANSI-codierte Strings benutzt. Solcher Code ist potentiell verlustbehaftet, weil nicht alle Unicode-Zeichen in einem AnsiString repräsentiert werden können. Idealerweise benutzt man nur String und UTF8String .


Anmelden zum Antworten