Struct unter C in Datei speichern und wieder einlesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Struct unter C in Datei speichern und wieder einlesen

    Ich hoffe dass man mir hier helfen kann, ich beiß mir mit meinem Kollegen hier die Zähne an unserem Programmieren-Projekt aus.

    Wir haben eine kleine Datenbank programmiert, die Autos mit verschiedenen Werten aufnehmen kann (Modell, Marke, PS,...) und wollen nun eine Dateiaus- sowie eingabe realisieren.
    Die Ausgabe klappt eigentlich, aber das Einlesen macht Probleme.

    Da ich mich mit Programmieren nicht so gut auskenne (ist ehrlich gesagt nicht so mein Ding), weiß ich jetzt nicht genau, welchen Codeschnipsel ich hier posten soll, aber erstmal kopier ich mal den Struct hier rein:

    Quellcode

    1. typedef struct{ //Struktur für Daten der einzelnen Fahrzeuge anlegen
    2. int FID;
    3. char FMarke[20];
    4. char FModell[20];
    5. int FPS;
    6. int FKilometer;
    7. char FKateg[15];
    8. int FWert;
    9. char FZulassung[10];
    10. char FKraftstoff[10];
    11. char FFarbe[10];
    12. }FAHRZEUGDATEN;
    Alles anzeigen


    Der Code fürs Speichern sieht so aus:

    Quellcode

    1. void dbspeichern()
    2. {
    3. FILE* datei;
    4. if ((datei = fopen("db.dat", "w")) != NULL)
    5. {
    6. fwrite(Fahrzeuge,sizeof(Fahrzeuge),1,datei);
    7. fclose(datei);
    8. }
    9. else
    10. printf("Die Datei kann nicht geoeffnet werden!");
    11. }
    Alles anzeigen


    Ich habe zwar auch schon einen Code für die Eingabe geschrieben, aber das Problem ist, dass der erste Datensatz an jede Position kopiert wird. Sprich: Wenn ich einen Fahrzeugbestand von 3 Autos habe, z.B. 1. Ford 2. Audi und 3. BMW, dann wird an alle drei Stellen der erste Datensatz hinkopiert, d.h. der Ford. So sieht der Code fürs einlesen aus:

    Quellcode

    1. void dbeinlesen()
    2. {
    3. FILE *datei;
    4. datei = fopen("db.dat", "rb");
    5. fread(Fahrzeuge, sizeof(Fahrzeuge),1,datei);
    6. fclose(datei);
    7. }


    Ich ahne schon, dass ich komplett auf dem Holzweg bin, vielleicht kann mir ja jemand helfen :)
  • Na der Quellcode, den ihr hier postet, gibt schon mal passende Suchbegriffe ;)
    Aber der Code fürs Speichern macht nicht das was er eurer Aussage nach machen soll ?(
    Euer Code löscht bei jedem Aufruf zum schreiben den Inhalt der "db.dat"!

    Hier ein Link warum da was nicht passen sollte:
    cplusplus.com/reference/clibrary/cstdio/fopen.html

    Da steht was ihr optimieren könnt damit eure Ausage mit dem Quelltext übereinkommen kann.

    MfG bcc-fan
  • Wenn du binary liest, solltest du auch binary speichern :).

    Quellcode

    1. if ((datei = fopen("db.dat", "w")) != NULL) [...]
    2. datei = fopen("db.dat", "rb");


    Und btw für lokale Datenbanken bietet sich sqlite sehr an. Ist klein kompakt und lässt sich gut in C integrieren und ist vor allem eine richtige Datenbank mit SQL etc.
    MfG
    Sometimes it pays to stay in bed in Monday, rather than spending the rest of the week debugging Monday's code. ~Dan Salomon
  • SQL, denke ich, ist hier nicht angesagt.

    Es ist eine der typischen "Hausaufgaben"-Problemstellungen - oft schon gestellt und auch schon mehrfach in
    diversen Foren bearbeitet. Das ist auch ein Grund das ich nicht wesentlich ausführlicher geworden bin.
    Ein weiterer Grund Quellcode und der andere Text passen nicht - aber vieleicht hat der Aufgabensteller
    ja nur die falsche Datei erwischt :D

    Der Beitragssteller soll mal ein wenig Eigeninitiative zeigen und die Hinweise in den Quellcode einarbeiten ;)
    Dann könnte man das Ganze schon zum laufen bringen 8)

    Die Autodaten in binary - why?

    MfG bcc-fan
  • bcc-fan schrieb:

    SQL, denke ich, ist hier nicht angesagt.

    Es ist eine der typischen "Hausaufgaben"-Problemstellungen - oft schon gestellt und auch schon mehrfach in
    diversen Foren bearbeitet. Das ist auch ein Grund das ich nicht wesentlich ausführlicher geworden bin.
    Ein weiterer Grund Quellcode und der andere Text passen nicht - aber vieleicht hat der Aufgabensteller
    ja nur die falsche Datei erwischt :D

    Der Beitragssteller soll mal ein wenig Eigeninitiative zeigen und die Hinweise in den Quellcode einarbeiten ;)
    Dann könnte man das Ganze schon zum laufen bringen 8)

    Die Autodaten in binary - why?

    MfG bcc-fan

    Weil im Textmodus das alles ganz anders gelesen wird.
    Aber man kann es im Textmodus schreiben, dann muss man es aber so auch auslesen.
    Aber nicht beides mischen. Daher kommen solche Fehler.
    MfG
    Sometimes it pays to stay in bed in Monday, rather than spending the rest of the week debugging Monday's code. ~Dan Salomon
  • bcc-fan schrieb:

    Ich denke mal Leerstellen wo "Zeichen" sein sollen oder komische Zeichen sind nicht so
    frustierend wie das der Inhalt eurer Testdatenbank gelöscht wird ;)
    Was meist in einer Fahrzeugbeschreibung drin ist passt auch in den Textmodus.

    MfG bcc-fan


    Ehm... ja.
    Binary oder nicht ist ein elementarer Unterschied. Als Beispiel wird ein Zeilenende unter Windows \r\n geschrieben. Das sind 2 Zeichen.
    Im Textmodus ist das eine Zeile. Im Binär-Modus liest man mehrere Zeichen. Schreib ich jetzt also eine Datei im Textmodus, wird immer pro Zeile \r\n eingefügt. Lese ich diese jetzt binary zurück, hab ich einen Fehler.

    en.wikipedia.org/wiki/Newline


    Reading from a text file or binary file is different too as a text file is
    automatically broken up into separate records as it read in based on
    the location of the end-of-line markers.

    linuxforums.org/forum/linux-pr…84-open-files-binary.html
    computer.howstuffworks.com/c39.htm


    Davon abgesehen die Geschwindigkeit. In einem binär geöffneten File kann ich hin und herspringen wie ich möchte, in einer Textdatei nicht.

    Mfg
    Sometimes it pays to stay in bed in Monday, rather than spending the rest of the week debugging Monday's code. ~Dan Salomon