binär speichern - finde fehler einfach net



  • hi!

    ich war gerade dabei ein Programm zu schreiben das mir eine Liste aus Strings speichert
    Ich will bewusst keine TStringList verwenden

    es lief ganz gut und plötzlich wurde garnichts mehr nach dem lesen aus der Datei angezeigt

    habe also nach und nach Zeilen entfernt in der Hoffnung den Fehler zu finden...

    das hier ist was dabei rausgekommen ist:
    aber ich sehe einfach den Fehler nicht!!
    Sitze schon nen Stunde dran und kom mir verdammt blöd vor...

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
     #include <stdlib.h>
     #include <stdio.h>
    
    #include <iostream>
    
    #include "Unit1.h"
    using namespace std;
    #include <fstream>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int longest(TStringList *a)
    {
    int max=0;
    for(int b=0; b<a->Count;b++)
    if(a->Strings[b].Length() > max)
    max = a->Strings[b].Length();
    return max;
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    const int length = 12;
    const int anzahl = 10;
    fstream File("List2.dat", ios::out|ios::binary);
    if (File.is_open())       // Wenn Datei geöffnet ist
    {
        File.write((const char*)&length, sizeof(length));        // 1. Länge speichern
        File.write((const char*)&anzahl, sizeof(anzahl));        // 1. Anzahl speichern
    
        File.close();   // Datei schließen
    }
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    fstream File2("List.dat", ios::in|ios::binary);
    if (File2.is_open())
    {
    
    int Size;
        File2.read((char*)&Size, sizeof(Size));   //Länge lesen
    int number;
            File2.read((char*)&number, sizeof(number));   //Anzahl lesen
        ListBox1->Items->Add(Size);                       //Länge ausgeben
        ListBox1->Items->Add(number);                     //Anzahl ausgeben
        }
     File2.close();
    }
    //---------------------------------------------------------------------------
    

    Könnt ihr mir helfen??

    Schonmal vielen Dank!!!!

    MfG Straightflush



  • "habe also nach und nach Zeilen entfernt in der Hoffnung den Fehler zu finden..."

    - ist auch 'ne Möglichkeit, die Nutzung des Debuggers jedoch die bessere!



  • danke für den Tipp
    aber was soll ich machen wenn der keine Meldung ausspuckt?

    welche option soll ich da überhaupt nehmen?
    Ausdrücke überwachen?

    kenn mich halt leider garnet aus mit dem ding


  • Mod

    Hallo

    bei FormCreate -> WriteFile "List2.dat"
    bei ButtonClick -> ReadFile "List.dat"

    da ist doch was oberfaul - oder sehe ich das falsch

    Mfg
    Klaus



  • 😡 und ich reg mich da ewig auf!!!!!!!!

    Sorry das ich euch belästigt habe!
    Nochmal vielen Dank!



  • darf ich euch nochmal stören?

    Ich hab jetzt versucht ein char binär zu speichern,
    der inhalt des char wird aus einem string gewonnen, dieser hat nur 7stellen,
    das char array aber hat 9, soll auch so sein

    habe ich jetzt abgespeichert und will wieder öffnen bekomme ich die Meldung: "Zugriffsverletzung bei Adresse[...] in Modul rtl60.bpl. Lesen von Adresse [...]

    Speicher ich nur den Zeiger ab??
    entferne ich das "&"ändert sich zwar der Inhalt der Datei und der gespeicherte "String" ist lesbar, das Problem beim auslesen ändert sich aber nicht...

    Kann mir einer von euch Profis nochmal helfen?

    So schreibe ich in die Datei

    TStringList *List = new TStringList;
    List->LoadFromFile("list.txt");
    const int length = longest(List);
    const int anzahl = List->Count;
    fstream File("List2.dat", ios::out|ios::binary);
    if (File.is_open())       // Wenn Datei geöffnet ist
    {
        File.write((const char*)&length, sizeof(length));        // 1. Länge speichern
        File.write((const char*)&anzahl, sizeof(anzahl));        // 1. Anzahl speichern
        char *buffer1 = new char(length);
        buffer1 = NULL;
        List->Strings[0].SetLength(length);
        buffer1 = List->Strings[0].c_str();
        File.write((const char*)buffer1, length);
    
        File.close();   // Datei schließen
    }
    

    und so lese ich daraus:

    fstream File2("List2.dat", ios::in|ios::binary);
    if (File2.is_open())
    {
    
    int Size;
        File2.read((char*)&Size, sizeof(Size));   //Länge lesen
    int number;
            File2.read((char*)&number, sizeof(number));   //Anzahl lesen
        ListBox1->Items->Add(Size);                       //Länge ausgeben
        ListBox1->Items->Add(number);                     //Anzahl ausgeben
        char *buffer2 = new char(Size);
        File2.read((char*)&buffer2, Size);
        String str = buffer2;
        ListBox1->Items->Add(str);
        }
    
     File2.close();
    

    Straightflush



  • keiner eine Idee/heißen Tipp/Beispiel?



  • Hi ich verstehe nicht wieso du ein *char noch extra in ein (char 😉
    verwandeln möchtest (es ist doch schon ein Zeiger)

    Z.B:
    File2.read((char*)&buffer2, Size);
    .
    .
    File2.read(buffer2, Size);



  • Ich glaub ich hab oben gerade Mist geschrieben.... dein Code ist an der Stelle richtig

    char *buffer2 = new char(Size+1); // +1
    

    und das am Schluss

    delete [] ch;
    


  • Straightflush schrieb:

    danke für den Tipp
    aber was soll ich machen wenn der keine Meldung ausspuckt?

    Debuggger spucken keine Meldungen aus sondern sind Handwerkszeuge welche die Option eröffnen den Programmablauf zu überprüfen.



  • morgaehn

    ich wuerde es ungefaehr so loesen:

    StreamHelper.h

    #ifndef StreamHelperH
    #define StreamHelperH
    #include <iostream>
    #include <system.hpp> // wegen AnsiString <- weiß nur net ob das jetz wirklich stimmmt
    
    template <class T>
     void BinaryWrite(std::ostream &out, T val)
    {
       out.write(reinterpret_cast<const char*>(&val), sizeof(val));
    }
    
    template <class T>
    void BinaryRead(std::istream &in, T &in)
    {
       in.read(reinterpret_cast<char*>(&val), sizeof(val));
    }
    
    template<>
    void BinaryWrite(std::ostream &out, const AnsiString &str)
    {
       BinaryWrite(out, str.Length());
       out.write(str.c_str(), str.Length());
    }
    
    template<>
    void BinaryRead(std::istream &in, AnsiString &str)
    {
       int t_len; // muss gleich gross sein wie sizeof(AnsiString.Length())
       BinaryRead(in, t_len);
       if(!t_len) return;
       char *buffer = new char[t_len];
       in.read(buffer, t_len);
       str = AnsiString(buffer, t_len);
       delete[] buffer;
    }
    
    #endif
    

    in datei schreiben:

    TStringList *List = new TStringList;
    List->LoadFromFile("list.txt");
    
    std::ofstream datei("liste2.txt", std::ios::binary);
    BinaryWrite(datei, List->Count());
    for(int i = 0;i < List->Count();++i)
    {
       WriteBinary(datei, List[i]);
    }
    datei.close();
    

    aus datei lesen

    TStringList my_list;
    std::ifstream datei("liste2.txt", std::ios::binary);
    int count;
    BinaryRead(datei, count);
    while(count--)
    {
       AnsiString temp;
       BinaryRead(datei, temp);
       my_list.Add(temp);
    }
    datei.close();
    

    der source ist ungetestet. nur mal so aus dem kopf geschrieben

    Meep Meep


Anmelden zum Antworten