AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

StreamWrite erzeugt nur 0 Byte-File

Ein Thema von little_budda · begonnen am 5. Jun 2008 · letzter Beitrag vom 18. Jun 2008
Antwort Antwort
Seite 4 von 4   « Erste     234
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#31

Re: StreamWrite erzeugt nur 0 Byte-File

  Alt 17. Jun 2008, 16:22
Zitat von Muetze1:
Schonmal mit der Angabe des erstens Zeichens probiert?
Tatsächlich, mit folgender Zeile funktioniert es:

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.
Devid
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#32

Re: StreamWrite erzeugt nur 0 Byte-File

  Alt 17. Jun 2008, 16:24
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: PChar(DeinString)^
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#33

Re: StreamWrite erzeugt nur 0 Byte-File

  Alt 18. Jun 2008, 15:24
Zitat von Muetze1:
Der jetzige Code deckt alle Dateigrößen ab, auch ungerade

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 ?
Devid
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#34

Re: StreamWrite erzeugt nur 0 Byte-File

  Alt 18. Jun 2008, 15:35
@ 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.
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#35

Re: StreamWrite erzeugt nur 0 Byte-File

  Alt 18. Jun 2008, 15:45
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 ?
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#36

Re: StreamWrite erzeugt nur 0 Byte-File

  Alt 18. Jun 2008, 15:49
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).
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz