? Indexsequentielle Dateien mit C++



  • Wie kann erreicht werden, in eine 'C++ - eigene' Datei zu schreiben mit beispielsweise Rechnungsdaten: Rechnungsnr; Kundennr; RgDatum usw., eine Fehlermeldung zu erhalten, wenn die gleiche Rechnungsnr erneut gespeichert werden würde.

    Gibt es mit C++ die Möglichkeit Indexsequentielle Dateien zu schreiben wie beispielsweise in COBOL, wo es .dat und .idx Dateien gibt. (Was steht eigentlich in der IDX-Datei?).

    Oder muss jedesmal die Datei erst nach der Rechnungsnr durchsucht werden, wenn nicht vorhanden - speichern ?

    Welche 'stream-Function' sollte verwendet werden für solch eine Aufgabe (Der Inhalt der Datei sollte nicht mit einfachen Editoren zu lesen sein) ?

    Vielen Dank
    Gruß
    Fanker



  • In C++ basiert die Dateiarbeit auf dem Stream-Konzept, d.h. eine Datei ist einfach nur ein Strom von Zeichen. Strukturierte Dateiformen, die es in anderen Programmiersprachen geben mag, kennt C++ nicht. Wenn du sowas brauchst, musst du es entweder selbst auf Basis von Strömen implementieren oder dir eine Bibliothek suchen, die das kann.



  • Fanker schrieb:

    Welche 'stream-Function' sollte verwendet werden für solch eine Aufgabe (Der Inhalt der Datei sollte nicht mit einfachen Editoren zu lesen sein) ?

    Die Standardbibliothek bietet sowas wohl kaum an. Wenn du den Inhalt geheim halten möchtest, rate ich dir zu Verschlüsselungsalgorithmen.

    Wozu benötigst du denn das?



  • In der IDX-Datei steht der Primärschlüssel und ein Index, ggf. die Länge des Datensatzes.

    heißt also so ungefähr

    struct sIDX{
    char key[32];
    int index;
    int length;
    };

    Diese Einträge müssen alphabetisch sortiert sein.

    Man liest diese Datei aus und weiß natürlich, wo die andere Datei ist..
    Wenn man jetzt einen Eintrag sucht, kann man in den indizen suchen und lädt dann nur noch den gefundenen Datensatz aus der eigentlichen Datei.

    Das Ganze lohnt sich natürlich erst ab Datensatzlängen, die größer sind als der eigentliche Index. Es dient dazu, RAM zu sparen, weil man nicht die komplette Datei auslesen muss. Heutzutage ist es allerdings nur noch selten überhaupt notwendig- immerhin kost das KB RAM keine tausende Taler mehr..



  • Bashar schrieb:

    Wenn du sowas brauchst, musst du es entweder selbst auf Basis von Strömen implementieren..

    Das möchte ich gern, aber wie?



  • [quote="Nexus"]

    Fanker schrieb:

    Wozu benötigst du denn das?

    Datei zu schreiben mit beispielsweise Rechnungsdaten: Rechnungsnr; Kundennr; RgDatum usw., eine Fehlermeldung zu erhalten, wenn die gleiche Rechnungsnr erneut gespeichert werden würde

    Für ein Rechnungs/Inkasso-Programm, welches ich selbst entwickeln möchte.



  • Vielen Dank für die gute Erklärung.

    DocJunioR schrieb:

    ..Das Ganze lohnt sich natürlich erst ab Datensatzlängen, die größer sind als der eigentliche Index. Es dient dazu, RAM zu sparen, weil man nicht die komplette Datei auslesen muss. Heutzutage ist es allerdings nur noch selten überhaupt notwendig- immerhin kost das KB RAM keine tausende Taler mehr..

    Es ist/wird immer mehr erforderlich die Bewegungsdaten für längere Zeiträume zu speichern. Außerddem ist es doch uneffektiv 'jedesmal' die komplette Datei einzulesen (X-MB). - Und - Es ist doch auf lange Sicht besser unabhängig von 'externen' zu sein, auch wenn der Anfang etwas aufwendiger ist.

    Die Datensätze die ich plane bestehen aus bis zu 35 'Felder' davon sind 3 oder mehr Felder zusammen ein Index (der PrimSchlüssel).

    So etwas muss doch, gerade über C++, realisierbar sein - oder?



  • Fanker schrieb:

    ...
    Datei zu schreiben mit beispielsweise Rechnungsdaten: Rechnungsnr; Kundennr; RgDatum usw., eine Fehlermeldung zu erhalten, wenn die gleiche Rechnungsnr erneut gespeichert werden würde

    Für ein Rechnungs/Inkasso-Programm, welches ich selbst entwickeln möchte.

    Also das klingt schwer danach, als ob Dir mit einer Datenbank besser geholfen wäre. Da gibt's ja auch auf dem freeware-Markt so einiges (MySQL, ...).

    Sonst sitzt Du ewig an Deiner selbstgefrickelten Lösung, verplemperst wertvolle Zeit und bist nie wirklich zufrieden.

    Gruß,

    Simon2.



  • Was für Funktionen außer stream's gibt es noch, um mit C++ Daten in Dateien zu speichern?

    struct RgBewegung
    {
       int RgDatum;           // zusammen mit
       long RgNummer;         // RgNummer und
       int KundenNummer;      // KuNr eindeutiger 'Schlüssel'
       float Menge;
       ...
       float EinzelPreis;
       ...
       int KenzGeloescht;
       usw.
    };
    

    Es ist eigentlich nicht notwendig Datenzeilen zu löschen, ein Lösch-Kennzeichen wird gesetzt und der Satz gilt als gelöscht. >falls dies möglich ist.
    Somit kann jeder neue Satz hinten angehängt werden. (Festplattenspeicher ist ja auch kein Problem mehr)

    Sollte eine andere Sortierung benötigt werden, Daten auslesen und in eine Tmp-Datei schreiben. >so denke ich es mir 🙂

    Welche vorgehensweise wäre angebracht, wenn verhindern werden soll, dass ein Datensatz mit dem gleichen 'Schlüssel' ein zweites Mal gespeichert wird?

    Was für Funktionen außer stream's gibt es noch?

    Vielen Dank
    Fanker



  • Keine, sonst hätt ich dir das schon gesagt.


Log in to reply