Dynamisch Struct erweitern/verkleinern
-
Hi!
Ich weis zwar nicht, ob es hierhin gehört: ich möchte eine Datei einlesen. Die DatenStruktur habe ich als Struct-Klasse.
struct WSPC_DATEN { time_t zeit; int wert; unsigned char flag; };
Jetzt habe ich nur einen Datensatz. Wie kann ich jetzt mehr Datensätze einlesen, wenn ich nicht weis, wieviel Daten es sind? Wie wird der Speicher dafür reserviert?
Bis jetzt bin ich so weit:
WSPC_DATEN Pers; struct tm *newtime; fstream File("F:\\ws_pc.dat", ios::in|ios::binary); if (File.is_open()) { File.seekg(4, ios::beg); while (File.read((char*)&Pers, sizeof(Pers))) { anz++; newtime = localtime( &Pers.zeit ); // Convert to local time. //txt.Format("Datum: %02d.%02d.%02d - Uhrzeit = %02d:%02d", newtime->tm_mday,newtime->tm_mon,(newtime->tm_year)-100, newtime->tm_hour, newtime->tm_min); //AfxMessageBox(txt); } File.close(); txt.Format("%d Datensätze vorhanden",anz); AfxMessageBox(txt); }
-
Meinst Du, daß Du mehrere Datensätze von der gesamten Structure hast. Wenn ja: so etwas löse ich immer gerne mit einer verketteten Liste. Ich kann Dir jetzt nicht sagen, ob das die effizienteste und elegantes Möglichkeit ist. Sie funktioniert aber und reicht für meine Geschwindigkeitsanforderungen aus.
-
Schau dir mal die Container in der STL (Standard Template Library) an. Wie Borlanduser bereits sagt, mußt du bzgl. der Performance-Frage selbst entscheiden, welcher Container für dich geeignet ist. Aber fürs erste reicht der std::vector oder std::list aus der STL und du kannst da deine Pointer reinknallen und "sammeln".
Wenn in deinem Lehrbuch nichts darüber drin steht, ist ein gutes Buch über die STL oder gleich "Die C++ Programmiersprache" zu empfehlen.
Aber auch hier im Forum gibts viele Topics und sicherlich FAQs zum Thema vector.
-
BorlandUser hat Recht, genau das meine ich. Ich hab nur ein Lehrbuch von VisualC6++, da steht leider nichts drin.
-
Ich schreib dir mal das ganze im Pseudocode auf, weil das Prinzip ist nämlich immer das gleiche.
OK, und jetzt willst du mehrere WSPC_DATEN im Speicher halten?
Du benutzt deine Schleife wie gehabt und fügst folgendes ein:#include <vector> std::vector<WSPC_DATEN*> myWspcVector; // vector-Container anlegen für WSPC_DATEN-Pointer // ... while(bla bla) { WSPC_DATEN *wspc = new WSPC_DATE; // neues Element instazieren // hier Struktur füllen // ... myWspcVector.push_back(wspc); // Element ans Ende des vectors hängen }; // jetzt sind alle Elemente im vector myWspcVector.
Der vector hat viele Methoden, z.B. size() um die Elementanzahl feststellen zu können. Ansonst kannste den vector wie ein Array behandeln, also mit []-Operator zugreifen:
WSPC_DATEN *wspc = myWspcVector[2]; // drittes Element
Besorg dir ein vernünftiges Buch über die STL oder durchforste mal das Web, vector ist hier nur ein Beispiel.
-
Also man muss das Ganze auch nicht unbedingt mit einer verketteten Liste machen, mein ich.
Du willst eine Datei einlesen bei der du nicht weißt wievoft die Strukt drinnen ist.
Wenn dus mal eingelesen hast ändert sich ja nix mehr.
Also könnte man einfach einen Pointer auch die Struktur anlegen, dann einmal die Datei offen und 'zählen' wie oft das teil da drin is, oder evetuell kann man das auch ausrechnnen über Filesize und header-size/infos.
Danach legt man einfach mit new ein entsprechend Großes Feld von der Struktur an. Und liest dann alles ein!Und voila fertig
Grüße Flow
-
Das ist ne Idee, probier ich morgen aus. Danke!
-
Flow_cplus! yo, bring ihm gleich schlechten Programmier-Stil bei - bravo!
Und seit wann ist vector ne verkettete Liste? es ist ein dynamisches und sicheres Array!
Und was ist, wenn er später (nach dem er es vom File gelesen hat) erweitern will? Also weitere Elemente einfügen will? Da wird sicherlich nochmal die Frage kommen!
Mit dem Vector hat er kein Problem, einfach pusch_back() und dann kann er auch wieder den aktuellen Stand ins File speichern. Fertig! Nichts schlägt die Container, die ganz einfach ihren Nutzwert haben.
-
*gg* jaja, scheiß mich gleich mal zusammen :-), (im endeffekt hast du ja nicht ganz unrecht),
Aber ich finde das kommt immer darauf an, was man machen will. Stl ist sicher eine saubere Lösung und fexibel. Aber wenn man die nicht kennt muss man da erst mal durchsteigen, und verkettete Listen sind sicher nicht das simpelste Konstrukt. Vectoren sind natülich einfacher, aber auch nicht so flexibel.
Als schlechten Progemmiertstil empfinde ich das nicht unbedingt. Der Aufwand ist halt etwas geringer und man kommt schneller zum Ziel. Unsauber ist es auch nicht. Und das verhältnis von Aufwand und Ergebenis is auch ganz gut.
Ok will man alledings später das ganze dynamisch verändern, muss man klar auf eine Liste zurückgreifen.
Aber wenn man man Anfang nur einmal festlegen muss wieviel man braucht, und später werden Daten aus Dateien meist eh in anderen Stukturen oder so weiterverarbeitet.egal
Jeder wie ers braucht
Grüße
-
Ich hab jetzt ne Liste genommen, klappt super.
Eines stimmt aber sicher: Wer sich nicht auskennt, der muss erst mal durchsteigen! (Zitat von Flow_cplus)
Danke!!!!!