Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StreamWrite erzeugt nur 0 Byte-File (https://www.delphipraxis.net/115063-streamwrite-erzeugt-nur-0-byte-file.html)

DevidEspenschied 17. Jun 2008 15:22

Re: StreamWrite erzeugt nur 0 Byte-File
 
Zitat:

Zitat von Muetze1
Schonmal mit der Angabe des erstens Zeichens probiert?

Tatsächlich, mit folgender Zeile funktioniert es:

Delphi-Quellcode:
DateiStream.ReadBuffer(ReadMuster[1], lReadCount);
Obwohl ich den Sinn, ein Zeichen eines Strings zu verwenden, nicht ganz verstehe. Vielleicht muss ich das auch nicht. Thx for the help.

Muetze1 17. Jun 2008 15:24

Re: StreamWrite erzeugt nur 0 Byte-File
 
Zitat:

Zitat von devidespe
Obwohl ich den Sinn, ein Zeichen eines Strings zu verwenden, nicht ganz verstehe. Vielleicht muss ich das auch nicht. Thx for the help.

Er verwendet nicht das Zeichen an sich, sondern durch den das "VAR" bei der Argument-Deklaration wird ein Zeiger auf das angegebene Element gebildet. Somit wird der Funktion an sich der Zeiger auf das 1. Zeichen des Strings übergeben und damit genau der Speicherplatz, wo die Daten hin sollen.

Du kannst auch alternativ folgendes angeben:
Delphi-Quellcode:
PChar(DeinString)^

DevidEspenschied 18. Jun 2008 14:24

Re: StreamWrite erzeugt nur 0 Byte-File
 
Zitat:

Zitat von Muetze1
Der jetzige Code deckt alle Dateigrößen ab, auch ungerade :warn:

Delphi-Quellcode:
function DateiSchreiben(const AFilename: string; const AFileSize: Int64): boolean;
const
  coFileData = '#abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+';
var
  lStream: TStream;
  lBytesToWrite: Int64;
  lWriteCount: Int64;
begin
  result := false;

    // Erstmal den Stream öffnen. Wenn das nicht klappt, brauch ich kein Array...
  lStream := TFileStream.Create(AFilename, fmCreate or fmShareDenyWrite);
  try
    lBytesToWrite := AFileSize;
    while ( lBytesToWrite > 0 ) do
    begin
      lWriteCount := Min(lBytesToWrite, length(coFileData));

      lStream.WriteBuffer(coFileData, lWriteCount);

      Dec(lBytesToWrite, lWriteCount);
    end;

    result := true;
  finally
    lStream.free;
  end;
end;
Wieder ungetestet, aber sollte so klappen.

Jetzt muss ich hierzu noch einmal eine (möglicherweise unsinnige) Frage stellen:

Wenn ich nun anstatt

Delphi-Quellcode:
const
  coFileData = '#abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+';
coFileData als STRING[64] deklariere und in der ersten Funktionszeile den oben dargestellten Inhalt zuweise, wird mir jedesmal vor dem Text ein @ mit in die Datei geschrieben.

Delphi-Quellcode:
var
  lStream: TStream;
  lBytesToWrite: Int64;
  lWriteCount: Int64;
  coFileData: STRING[64];
begin
  result := false;
  coFileData:='#abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+';
  ...
Woran kann das liegen ?

Namenloser 18. Jun 2008 14:35

Re: StreamWrite erzeugt nur 0 Byte-File
 
@ dürfte der ASCII-Code für 64 sein. Duw irst ja schon bemerkt haben, dass man auf das erste zeichen eines Strings mit s[1] zugreif statt s[0]. Das liegt daran, dass in s[0] die Länge des Strings steht, bei dir also 64.

DevidEspenschied 18. Jun 2008 14:45

Re: StreamWrite erzeugt nur 0 Byte-File
 
Ja, ASCII Code 64 steht für @. Aber da ich diesen ASCII Code nirgendwo angebe, dürfte er theoretisch auch nicht in die Datei geschrieben werden. Oder verstehe ich das was falsch ?

Muetze1 18. Jun 2008 14:49

Re: StreamWrite erzeugt nur 0 Byte-File
 
Die Konstante wird intern als ShortString abgelegt, ist also zum alten Pascal kompatibel. Dort waren die Strings auf 255 Zeichn begrenzt, da das 0. Zeichen die Länge des Strings angegeben hatte. Deshalb ist es bei AnsiStrings auch verboten auf den 0. Index zu zu greifen.

So, da du nun bei der Konstante einen ShortString erhälst und nicht das erste Zeichen angibst, wird hier die Variable an sich komplett gespeichert und die fängt mit diesem Längenbyte an.

BTW: Aus genau diesem Grund werden auch konstante Strings mit einer Länger von über 255 Zeichen vom Compiler angemeckert und müssen mit einem Pluszeichen aufgetrennt werden (in intern einzelne ShortStrings).


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz