TFileStream - Datei enthält nicht die korrekten Daten



  • Hallo,

    ich habe 4 Edit Felder, dass 1. gibt den Ort der Datei an, de anderen kann man per Button1 speichern, mit einem Klick auf Button 2 sollen die Daten in ein Memo Feld eingelesen werden:

    Speichern:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      const int anzahl = 3;
      int i, ii;
      int Zahl;
      int *ZeigerAufZahl = &Zahl;
      AnsiString Wort;
      AnsiString *ZeigerAufWort = &Wort;
      AnsiString eintrag[3];
    
      for (i = 0; anzahl>i; i++)
      {
    	  TEdit *Zeiger = dynamic_cast<TEdit*>(FindComponent("Edit"+IntToStr(i+2)));
    	  eintrag[i] = Zeiger->Text;
      }
    
      TFileStream* Stream;
      Stream = new TFileStream(Edit1->Text, fmCreate);
    
      Zahl = anzahl;
    
      Stream->Write(ZeigerAufZahl ,sizeof(Zahl));
    
      for (ii = 0; anzahl>ii; ii++)
      {
    	  Zahl = eintrag[ii].Length();
    	  Stream->Write(ZeigerAufZahl,sizeof(Zahl));
    	  Wort = eintrag[ii];
    	  Stream->Write(ZeigerAufWort,Zahl);
      }
    
      delete Stream;
    }
    

    zum Öffnen:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      const int anzahl = 3;
      int Zahl;
      int *ZeigerAufZahl = &Zahl;
      int i;
      AnsiString Wort;
      AnsiString *ZeigerAufWort = &Wort;
      AnsiString eintrag[3];
    
      TFileStream* Stream;
      Stream = new TFileStream(Edit1->Text, fmOpenRead);
    
      Stream->Read(ZeigerAufZahl, sizeof(Zahl));
    
      for (i=0; i<anzahl; i++)
      {
    	 Stream->Read(ZeigerAufZahl, sizeof(Zahl));
    	 Stream->Read(ZeigerAufWort, Zahl);
    	 Memo1->Lines->Add(Wort);
    	 eintrag[i] = Wort;
      }
    
     delete Stream;
    }
    

    Beim Öffnen kommt eine Invalide Pointer Fehlermeldung und beim Speichern habe ich gemerkt, dass die Datei nicht die Daten der Edit Felder enthält.

    Ich weiß das lange Codes nicht gern gesehen sind, aber ich habe absollut keine Ahnung wo ich ansetzen soll.

    Vielen Dank für jede Hilfe!



  • Zeiger auf AnsiString mit Wort.c_str() !

    Für deine 4 Edit-Felder bist du schneller wenn du Sie Direkt anspreichst,..

    eintrag[0]=Edit1->Text;
    eintrag[1]=Edit2->Text;
    eintrag[2]=Edit3->Text;
    eintrag[3]=Edit4->Text;

    Stream->Write(Zeiger auf Daten,Länge in Byte)

    somit heists richtig

    Stream->Write(Wort.c_str(),Wort.Length()+1) //Wegen 0-Terminierung von AnsiString
    zum lesen
    Stream->Read(Wort.c_str(),Stream->Size)

    Mit dem Wissen sollte es funktionier, was du genau willst habe ich noch nicht genau verstanden ?



  • Hallo

    Zum Speichern von AnsiString ist TStringList besser geeignet, da must du nicht mit C-Strings rumhantieren. Näheres findest du über die SuFu, in der TOP3 der FAQ hier im Forum und in der BCB-Hilfe.

    bis bald
    akari



  • Vielen Dank für diie Antworten. Die Variante von christianz hat mit einer kleinen änderung geklappt - was das für einen Sinn macht? Keinen! Ich wollte nur probieren wie ich Daten (auch Integers) abspeichern kann. In Delphi habe ich oft Streams verwendet - für reine AnsiStrings hat akari recht!


Anmelden zum Antworten