Datenstruktur
-
Hallo,
ich möchte gern C++ lernen und versuche u.a. heraus zu finden, wie die Daten von Anwendungsprogrammen in C++ gespeichert werden. Es gibt wohl die Möglichkeit über ODBC an Datenbanken wie beispielsweise Access anzuknüpfen, oder Daten als ASCII, oder binär zu speichern.
Gibt es in C/C++ eine eigene Datenbank(-struktur?), so ähnlich wie es bei Cobol Indexsequentielle Dateien gibt?
Es geht darum die Daten (z.B. Lohn-Daten) so zu speichern, dass diese nicht mit einem Editor zu lesen sind und dabei gleichzeitig unabhängig von einem "externen" Datenbankprogramm zu sein.
Auch wenn diese Frage mit ja bzw. nein zu beantworten ist - bin ich für eine Info/Link oder weiterführende Hinweise oder welche Funktion in C++ sehr dankbar.
Vielen Dank
-
Hi,
also zuallererst eimal : Nein, C++ hat kein Hauseigenes Format, es ist flexibel.
Du musst dich um die Serialisierung deiner Daten selber kümmen.
Es gibt aber sicherlich Hilfsbibliotheken.Wofür du dich entscheidest, hängt natürlich von den Anforderungen ab.
Im einfachsten Falle hast du eine lineare Datenstruktur.
Dann nimmst du einfach ein Array des Typs einer struct.Hängt von der Anzahl der Einträge ab, ob du damit auskommst.
Mit Indexsuche wird das ganze natürlich viel schwerer.
Vielleicht wirst du hier fündig:
http://www.mathtools.net/C_C__/Database/
-
Um unabhängig von einem externen Datenbankprogramm zu sein, eignet sich ODBC eigentlich nicht. In der Regel setzt das ja genau einen Datenbankserver irgendwo voraus (z.B. SQL Server, Oracle oder mySQL).
Varianten bei denen kein externes System notwendig ist, sind z.B. sqlite (www.sqlite.org - die Datenbank ist eine kleine C-Bibliothek und kann mit SQL angesprochen werden) oder embedded mySQL (www.mysql.com - hier wird der gesamte mySQL Server mit in die Applikation kompiliert).Können die Daten im Speicher gehalten werden, kann oftmals wie SeppSchrot schon sagt mit Standard C++ Mitteln (z.B. STL) sehr leicht Strukturen aufgebaut werden. Indizes sind mittels std::map (oder std::multimap) leicht möglich.
-
Vielen Dank für die Unterstützung.
@SeppSchrott
Ich werde ein Anwendungsprogramm programmieren, ähnlich einer Lohnbuchhaltung, wo Kontenbewegungen über Jahre gespeichert werden.SeppSchrot schrieb:
Dann nimmst du einfach ein Array des Typs einer struct.
Hängt von der Anzahl der Einträge ab, ob du damit auskommst.
> wo liegt den ca. die Obergrenze?
SeppSchrot schrieb:
Vielleicht wirst du hier fündig:
http://www.mathtools.net/C_C__/Database/> werde ich mir ansehen. Danke.
niemand schrieb:
Können die Daten im Speicher gehalten werden, kann oftmals wie SeppSchrot schon sagt mit Standard C++ Mitteln (z.B. STL) sehr leicht Strukturen aufgebaut werden.
aber irgendwann müssen die Daten doch gespeichert werden, oder wie ist das gemeint?
niemand schrieb:
Indizes sind mittels std::map (oder std::multimap) leicht möglich.
vermutlich ist das Auffinden der Daten, bei beispielsweise Listings, über Indizes schneller?
Auch dir : Danke.
Gruß aus Bremen
-
Gast aus Bremen schrieb:
vermutlich ist das Auffinden der Daten, bei beispielsweise Listings, über Indizes schneller?
Wenns viele Daten sind und du immer/oft nach den selben Key suchen musst ist es schon schneller, aber die DB wird auch größer.
-
Es gibt grundsätzlich zwei verschiedene Möglichkeiten tabellarische Daten zu verarbeiten. Im Speicher oder in einer Datenbank. Ist die Menge überschaubar (und bleibt so, weil die Analyse ergibt, dass nicht mehr Daten anfallen), können die Daten in den Speicher geladen werden und dort verarbeitet werden. Am schnellsten laden und speichern kann man mit einem festen Satzformat. Damit niemand die Daten auf Anhieb im Editor lesen kann, reicht ein einfaches XOR zum verschleiern (die Daten sind danach binär). Danach kann man im Speicher mit den STL üblichen Mitteln auf die Daten zugreifen. Das ist alles Handarbeit, ggf. bietet sich für sowas eine Klassenbibliothek an, die bereits entsprechende Klassen (Stichwort: MemoryDataset) hat. Für eine Lohnbuchhaltung willst Du bestimmt ja auch ein GUI haben. Oft bieten genau diese Bibliotheken (Qt, .NET, VCL, (MFC)) bereits Klassen zum Verwalten von Daten in Datenbank ähnlichen Strukturen und deren Darstellung in Fenstern mit entsprechenden Funktionen zur Eingabe/Ändern/Löschen. Damit ist dann die Verwendung der STL hinfällig und der händische Aufwand reduziert sich stark. Dafür "lernt" man nicht mehr, wie man sowas selbst macht.
Auf die zweite Möglichkeit greifst Du zurück, wenn die Daten nicht mehr im Speicher passen könnten (oder es keine Sinn macht, sie in den Speicher zu laden). In diesem Fall arbeitest Du mit SQL auf einer Datenbank und extrahierst nur das was der User haben will (z.B. zeige mir alle Bewegungen auf dem Konto XYZ im letzten Jahr). In den meisten Fällen wird ein Datenbankserver dafür genutzt, d.h. die Abfrage wird von dem Serverprogramm gemacht und Du bekommst nur noch das Ergebnis zurück. Kann viel Arbeit ersparen. Auf die Datenbanken kann man mit den Hersteller eigenen Protokollen (z.B. bei Oracle mit OCI) zugreifen, oder was üblicher ist mit allgemeinen Protokollen wie ODBC. Je nachdem, was für eine Klassenbibliothek (siehe oben) Du verwendest, kommst Du aber auch damit nicht mehr in Berührung, sondern die Klassenbibliothek nimmt Dir Arbeit ab, mit der Datenbank zu reden.
Im Gegensatz zu Oracle und ähnlichen DBMS wird SQLite einkompiliert und benötigt daher keinen extra Server.Mein Sohn (17 Monate) unterbricht gerade rabiat mein Schreiben
Sorry
cv nv