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 einfachString
?
-
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 nurString
. C++Builder unterstützt eine reduzierte Form vonAnsiString
. 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 einemAnsiString
repräsentiert werden können. Idealerweise benutzt man nurString
undUTF8String
.