Datei zum Lesen öffnen, mit TFileStream.



  • Hallo,

    kann mir jemand bitte sagen, ob dieser Code hier sauber ist?

    AnsiString sFile = edFile->Text;
      TFileStream *fsFile = new TFileStream(sFile, fmOpenRead);
      int iSize = fsFile->Size;
      fsFile->Position = 0;
      char *cText = new char[iSize];
      fsFile->Read(cText, iSize);
      AnsiString sTemp = cText;
      delete[] cText;
      delete fsFile;
    

    Dankeschön!
    xy



  • Warum fragst du nicht deinen Compiler? Der weiß bestimmt Rat.

    Ansonsten: delete mit [] ist mir bislang noch nie begegnet...



  • char *cText = new char[iSize + 1]; // für die Null-Terminierung
    

    Dasd schrieb:

    delete mit [] ist mir bislang noch nie begegnet...

    Dann hast du bei den C-Grundlagen nicht aufgepasst. 😉



  • Dasd schrieb:

    Warum fragst du nicht deinen Compiler? Der weiß bestimmt Rat.

    Compiler meldet keine Fehler, sonst hätte ich anders gefragt. Ich wollte eigentlich wissen, ob der Code vom "Aufbau" her sauber ist. Zum Beispiel, ob

    delete[]
    

    an dieser Stelle korrekt ist.

    MfG
    xy



  • Vielen herzlichen Dank, Jansen!

    MfG
    xy



  • Jansen schrieb:

    Dann hast du bei den C-Grundlagen nicht aufgepasst. 😉

    Nein, so etwas gab es bei meinen C-Grundlagen nicht. Außerdem, ist OOP nicht eher C++-spezifisch? Ok, ich mach Schluss, sonst wird das hier noch Offtopic.



  • Ist zwar C++ Syntax, hat aber nix mit OOP zu tun...

    -junix



  • Dasd schrieb:

    Nein, so etwas gab es bei meinen C-Grundlagen nicht.

    Sorry, mein Fehler, ich meinte natürlich die C++-Grundlagen.



  • Jansen schrieb:

    char *cText = new char[iSize + 1]; // für die Null-Terminierung
    

    Das ist allerdings nur dann notwendig, wenn "cText" tatsächlich als c-String verwendet werden soll. Als reiner Byte-Puffer genügt die Größe "iSize".

    xy schrieb:

    kann mir jemand bitte sagen, ob dieser Code hier sauber ist?

    Man könnte noch anmerken, daß Dein Quellcode nicht ermittelt, wieviele Bytes Deines Arrays "cText" tatsächlich mit Daten überschrieben worden sind - also:

    int readBytes = fsFile->Read(cText, iSize);
    //...
    for (int i = 0; i < readBytes; i++)
    {
        //mach irgend was mit cText[i] ...
    }
    

    Wenn Du die c-String-Variante von Jansen verwenden willst, brauchst Du "readBytes" auch, um das Array an der richtigen Stelle terminieren zu können. TFileStream::Read macht das nicht für Dich.

    int readBytes = fsFile->Read(cText, iSize);
    cText[readBytes] = 0;
    


  • dschensky schrieb:

    Wenn Du die c-String-Variante von Jansen verwenden willst, brauchst Du "readBytes" auch, um das Array an der richtigen Stelle terminieren zu können. TFileStream::Read macht das nicht für Dich.

    Guten Morgen!

    Entschuldigung, aber ich bin jetzt etwas irretiert.
    Der Inhalt der gelesenen Datei möchte ich als AnsiString weiterbearbeiten und am Ende zurückgeben.
    Brauche ich in diesem Fall dies hier?

    dschensky schrieb:

    int readBytes = fsFile->Read(cText, iSize);
    cText[readBytes] = 0;
    

    MfG
    xy



  • xy,
    ja, damit Du z.B. das hier fehlerlos machen kannst:

    AnsiString s(cText);
    


  • Alles klar. Vielen Dank, dschensky!

    MfG
    xy


Anmelden zum Antworten