Einfache Inventar-Datenbank via C++ auf txt-Basis



  • Hallo liebe Community,

    ich bin noch neu hier und auch noch recht frisch in der C++-Programmierung, habe aber schon gleich meine erste Frage:

    Ich möchte ein kleines Inventarisierungsprogramm in C++ als Konsolenanwendung schreiben, das verschiedene Items in einem Lager erfassen & bearbeiten kann.
    Jedes Item besitzt eine einmalige ID. Da zu jedem Item zusätzliche Informationen erfasst werden sollen (Gewicht, Vorhandene Menge, etc.) habe ich im Code einen struct-Verbund definiert, der für jede Eigenschaft eine passende Variable bereit hält. Für jedes neu hinzugefügte Item wird also ein Exemplar dieses struct-Typs erzeugt und mit den entsprechenden Daten befüllt.

    Damit die eingegebenen Daten (also der Bestand) ein Beenden und Neustarten des Programms übersteht, muss ich die Daten ja irgendwo zwischenspeichern.
    Mein Idee war, sie mittels fstream in eine txt-datei zu schreiben, auf die das programm während der Laufzeit dann zugreifen kann. Dabei hat jedes Item eine Zeile: Beginnend mit der unique-ID, danach mit Tabulatoren gefolgt die entsprechenden Eigenschaften/Variablen und am Ende ein Zeilenumbruch. Also im Endeffekt eine zweidimensionale Datenbank auf txt-Basis.

    Frage 1: Ist diese Lösung halbwegs brauchbar? Oder gibt es elegantere Möglichkeiten, die nicht als zu schwer umzusetzen sind? (Vorgefertigte Datenbank-Module o.Ä.)
    Frage 2: Macht es Sinn, den kompletten Inhalt der txt-Datei zu Programmstart in einen string einlasen zu lassen, damit ich den Inhalt zur Runtime bearbeiten kann? Oder bläst das den Speicherbedarf der Software zur Laufzeit enorm auf?
    Gibt es eine Möglichkeit, dass das Programm zur Laufzeit die txt-datei bearbeiten kann, ohne den zwischenschritt über einen string zu nehmen? Als Operationen müssen "Item anhand der ID Suchen & Anzeigen", "Item Löschen" und "Eigenschaften eines Items verändern" möglich sein.

    Ich freue mich auf eure Vorschläge! 🙂



  • Wieviele Items sollen denn dort drin gespeichert sein?
    Bei relativ wenigen (<50) ginge es m.E. noch mit einer Textdatei (aber diese mußt du dann immer komplett neu beschreiben), aber sonst würde ich dir zu einer lokalen (embedded) Datenbank wie SQLite raten (es gibt auch spezialisierte C++ Wrapper dafür, z.B. SQLiteCpp).



  • Also zum Lernen kannst du das schon so machen. Hat vor allem den Vorteil, dass einfach mal in deine Daten-Datei schauen kannst.

    Ich würde dir ansonsten mal https://www.sqlite.org/cintro.html empfehlen. Eine einfache SQL-artige Datenbank.

    Zu Frage 2: du würdest natürlich zeilenweise einlesen, ein Objekt pro Zeile. Du solltest ggf. den >>-Operator für deinen Datentyp implementieren, damit du direkt aus dem stream in dein Objekt einlesen kannst.

    Ein Problem besteht bei tsv-Dateien aber: wenn du "vorn" in der Datei irgendwas ändern möchtest, z.B. die Menge von 9 auf 10 erhöhst, dann ist der String auf einmal ein Zeichen länger und die musst die gesamte Datei neu schreiben. Nicht schön, sowas.

    Also lieber gleich auf eine Datenbank zurückgreifen 🙂

    (wie gesagt, wenn du das zum Lernen machst, halte ich auch deinen Weg erstmal für sinnvoll)

    Edit: Falsches Wort ersetzt. Und The69 war schneller mit derselben Empfehlung. 👍



  • Vielen Dank wob & Th69.
    SQLite klingt nach einem guten Weg, da werde ich mich mal reinlesen.
    Verstehe ich das richtig, dass ich keine externe Software installieren muss, um eine SQLite-Datenbank in den Code zu integrieren?
    Reicht es also, eine entsprechende Bibliothek zu inkludieren, oder wie muss man daam Anfang vorgehen?



  • Genau, im Source einfach die SQLite-Header einbinden. Und du mußt die "sqlite3.lib" zu deinem Projekt dazulinken (und die dazu passende "sqlite3.dll" bei deiner EXE-Datei dazulegen).



  • Th69 schrieb:

    Genau, im Source einfach die SQLite-Header einbinden. Und du mußt die "sqlite3.lib" zu deinem Projekt dazulinken (und die dazu passende "sqlite3.dll" bei deiner EXE-Datei dazulegen).

    Oder sqlite3.h und sqlite3.c ins Projekt einbinden. Das finde eigentlich am einfachsten, weil ich mich dann nicht mit aus irgendwelchen Gründen unpassenden Bibliotheksdateien herumschlagen muss.


Log in to reply