Struct binär speichern

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

  • Struct binär speichern

    Hi ich möchte bei meinem programm ein struct binär in eine Datei speichern
    dazu habe ich zunächst ein programm geschrieben welches zuerst das struct in die Datei schreibt... vorher einen testwert in ein Label schreibt... später wird dann wieder das Struct aus der Datei geladen und der Selbe-Wert in ein anderes Label übergeben.
    Die beiden Anzeigen der Labels sind korrekt und gleich. Hiermal der Quelltext von dem Programm:

    Quellcode

    1. //---------------------------------------------------------------------------
    2. #include <vcl.h>
    3. #pragma hdrstop
    4. #include <iostream>
    5. #include <fstream>
    6. #include "Programm1.h"
    7. //---------------------------------------------------------------------------
    8. #pragma package(smart_init)
    9. #pragma resource "*.dfm"
    10. using namespace std;
    11. TForm1 *Form1;
    12. struct Eintrag
    13. {
    14. char adresse[40];
    15. int zeichen;
    16. int interval;
    17. };
    18. //---------------------------------------------------------------------------
    19. __fastcall TForm1::TForm1(TComponent* Owner)
    20. : TForm(Owner)
    21. {
    22. }
    23. //---------------------------------------------------------------------------
    24. void __fastcall TForm1::FormCreate(TObject *Sender)
    25. {
    26. Eintrag first;
    27. first.zeichen = 126;
    28. first.interval = 15;
    29. strcpy(first.adresse,"www.google.de");
    30. fstream File("Person.dat", ios::out|ios::binary|ios::in);
    31. if (File.is_open())
    32. {
    33. Label2->Caption = first.adresse;
    34. File.write((const char*)&first, sizeof(first));
    35. File.close(); // Datei schließen
    36. }
    37. // Datei zum Lesen öffnen.
    38. File.open("Person.dat", ios::in|ios::binary);
    39. if (File.is_open())
    40. {
    41. Eintrag second;
    42. while (File.read((char*)&second, sizeof(second)))
    43. Label1->Caption = second.adresse;
    44. }
    45. }
    46. //---------------------------------------------------------------------------
    Alles anzeigen


    Jetzt habe ich ein zweites Programm entworfen welches AUSSCHLIEßLICH aus der Datei ließt.
    Ich habe zwei Versionen des Programms geschrieben.
    Bei der ersten wird als Wert 1310016 ausgegeben wo eigentlich 126 stehen sollte.
    hier der Quelltext dazu:

    Quellcode

    1. //---------------------------------------------------------------------------
    2. #include <vcl.h>
    3. #pragma hdrstop
    4. #include <iostream>
    5. #include <fstream>
    6. #include "Programm2.h"
    7. //---------------------------------------------------------------------------
    8. #pragma package(smart_init)
    9. #pragma resource "*.dfm"
    10. using namespace std;
    11. TForm1 *Form1;
    12. struct Eintrag
    13. {
    14. char adresse[40];
    15. int zeichen;
    16. int interval;
    17. };
    18. //---------------------------------------------------------------------------
    19. __fastcall TForm1::TForm1(TComponent* Owner)
    20. : TForm(Owner)
    21. {
    22. }
    23. //---------------------------------------------------------------------------
    24. void __fastcall TForm1::FormCreate(TObject *Sender)
    25. {
    26. // fstream damit die Datei zuerst schreibend und dann lesend geöffnet werden kann.
    27. fstream File("Person.dat", ios::out|ios::binary|ios::in);
    28. // Datei zum Lesen öffnen.
    29. File.open("Person.dat", ios::in|ios::binary);
    30. if (File.is_open())
    31. {
    32. Eintrag second;
    33. File.read((char*)&second, sizeof(second))
    34. Label1->Caption = second.zeichen;
    35. }
    36. }
    37. //---------------------------------------------------------------------------
    Alles anzeigen


    In der zweiten Version habe ich den letzten Teil in eine While Schleife verwandelt:

    Quellcode

    1. while(File.read((char*)&second, sizeof(second)))
    2. Label1->Caption = second.zeichen;


    Hier ändert sich an dem Caption des Labels garnichts...

    Was mache ich falsch beim auslesen der Datei??
    Wenn es bei meinem ersten Programm geht müsste das Reine lesen doch auch gehen oder???
    beide Programme sind im selben Ordner haben also zugriff auf die *.dat..

    Kann mir jemand helfen der schon Erfahrung mit dem binären speichern hat??

    MfG Straightflush
  • Ich hab das ganze jetzt mal in ein programm geschrieben was für euch schneller zum lesen ist...
    Am anfang wird alles in eine Datei geschrieben danach wieder herausgelesen...
    Leider stehen im Label2 nur wirre Zeichen und nicht das selbe wie in Label1 sowie es eigentlich sein sollte
    Hier mal der Code

    Quellcode

    1. //---------------------------------------------------------------------------
    2. #include <vcl.h>
    3. #pragma hdrstop
    4. #include <iostream>
    5. #include <fstream>
    6. #include "Programm1.h"
    7. //---------------------------------------------------------------------------
    8. #pragma package(smart_init)
    9. #pragma resource "*.dfm"
    10. using namespace std;
    11. TForm1 *Form1;
    12. struct Eintrag
    13. {
    14. char adresse[40];
    15. int zeichen;
    16. int interval;
    17. };
    18. //---------------------------------------------------------------------------
    19. __fastcall TForm1::TForm1(TComponent* Owner)
    20. : TForm(Owner)
    21. {
    22. }
    23. //---------------------------------------------------------------------------
    24. void __fastcall TForm1::FormCreate(TObject *Sender)
    25. {
    26. Eintrag first;
    27. first.zeichen = 1111;
    28. first.interval = 15;
    29. strcpy(first.adresse,"www.google.de");
    30. // fstream damit die Datei zuerst schreibend und dann lesend geöffnet werden kann.
    31. fstream File("Testdatei", ios::out|ios::binary);
    32. if (File.is_open())
    33. {
    34. Label1->Caption = first.adresse;
    35. File.write((const char*)&first, sizeof(first));
    36. File.close(); // Datei schließen
    37. }
    38. fstream File2("Testdatei", ios::in|ios::binary);
    39. // Datei zum Lesen öffnen.
    40. File2.open("Testdatei", ios::in|ios::binary);
    41. if (File2.is_open())
    42. {
    43. Eintrag second;
    44. File2.read((char*)&second, sizeof(second));
    45. Label2->Caption = second.adresse;
    46. }
    47. File2.close();
    48. }
    49. //---------------------------------------------------------------------------
    Alles anzeigen
  • Bei mir (Konsole) funktionierts.

    Zum prüfen:

    Quellcode

    1. #include <iostream>
    2. #include <fstream>
    3. using namespace std;
    4. struct Eintrag
    5. {
    6. char adresse[40];
    7. int zeichen;
    8. int interval;
    9. };
    10. int main()
    11. {
    12. Eintrag first;
    13. first.zeichen = 1111;
    14. first.interval = 15;
    15. strcpy(first.adresse,"www.google.de");
    16. fstream File("Testdatei", ios::out|ios::binary);
    17. if (!File)
    18. {
    19. cerr << "Fehler beim Öffnen der Datei!" << endl;
    20. return 1;
    21. }
    22. cout << "Lable1: " << first.adresse << endl;
    23. File.write((const char*)&first, sizeof(first));
    24. File.close(); // Datei schließen
    25. fstream File2("Testdatei", ios::in|ios::binary);
    26. //File2.open("Testdatei", ios::in|ios::binary);
    27. if (!File2)
    28. {
    29. cerr << "Fehler beim Schreiben der Datei!" << endl;
    30. return 1;
    31. }
    32. Eintrag second;
    33. File2.read((char*)&second, sizeof(second));
    34. cout << "Lable2: " << second.adresse << endl;
    35. File2.close();
    36. return 0;
    37. }
    Alles anzeigen