AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Fehler bei TFileStream.ReadBuffer mit Buffer size
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei TFileStream.ReadBuffer mit Buffer size

Ein Thema von XoRiC · begonnen am 2. Jul 2010 · letzter Beitrag vom 2. Jul 2010
Antwort Antwort
XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#1

Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 09:20
Hallo Forum,

ich habe ein Problem mit meinem FileStream, das ich mir nicht erklären kann.
Ich möchte aus einer 40 byte großen Datei die ersten 9 byte in einen Buffer einlesen.

Hier ist mein Code:
Delphi-Quellcode:
procedure Test;

  var buf: array of byte;
      buf_headsize: integer;
      FS: TFileStream;

  const FN: String = '.\Test.dat';

begin
  FS := TFileStream.Create(FN, fmOpenReadWrite);
  buf_headsize := 9;

  if (FS.Size >= buf_headsize) then begin
    // FS.Size = 40
    SetLength(buf, buf_headsize);
    showmessage(inttostr(High(buf))); // liefert 8

    try
      FS.Seek(0, soFromBeginning);
      FS.ReadBuffer(buf, buf_headsize); // manchmal gibt es hier schon eine Exception
    finally
      showmessage(inttostr(High(buf)));
      // lieferte schonmal -1, auch Werte wie 12 oder 9095 wurden hier angezeigt - brachte auch schon Exceptions
    end;

  end;
end;
Auf die Datei wird sonst nirgendwo im Code zugegriffen, sie liegt fest im Projektverzeichnis und wird nicht verändert.
Der FileStream wird auch korrekt initialisiert, immerhin ist ja der Wert FS.Size = 40 abrufbar.

Durch FS.ReadBuffer dürfte sich doch außer dem Inhalt des Arrays nicht ändern, die Größe sollte doch gleich bleiben?
Kann sich diesen Fehler (Kommentare im Code) jemand erklären?

NACHTRAG:
ich habe jetzt versucht, das Array buf mit fester Länge zu erzeugen:
var buf: array [0..8] of byte; So tritt kein Fehler auf. Allerdings wäre mir ein dynamisches Array sehr viel lieber, da ich es danach noch weiterverwenden möchte.

Vielen Dank wie immer für eure Hilfe,
Gruß Xoric
"Gods are fragile things; they may be killed by a whiff of science or a dose of common sense."
- Chapman Cohen

Geändert von XoRiC ( 2. Jul 2010 um 09:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 09:25
Schreib das mal so:
FS.ReadBuffer(buf[0], buf_headsize);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 09:38
FS.ReadBuffer(buf, ... .

Dieses überschreibt die "Variable"
und bei einem dynamischen Array oder String ist die Variable intern ein Zeiger.

Du überscheibts also den Zeiger, welcher aktuell nur 4 Byte groß ist und danach werden frende Daten oder nichtreservierte Speicherbereiche überschrieben (entspricht einem Buffer-Overrun).

Du willst aber die "Array-Daten" überschreiben.
also entweder das buf[0] um das erste Byte des Arrays zu referenzieren oder du brauchst eine andere "nichtzeiger"-Variable, wie z.B. ein statisches Array.

Delphi-Quellcode:
var buf: array of byte;
SetLengeh(buf, 9)
FS.ReadBuffer(buf[0], 9);
Delphi-Quellcode:
var buf: array[0..8] of byte;
SetLengeh(buf, 9)
FS.ReadBuffer(buf, 9);

// wobei hier ein dereferenzieren nicht schaden kann
var buf: array[0..8] of byte;
FS.ReadBuffer(buf[0], 9);

var buf: array[1..9] of byte;
FS.ReadBuffer(buf, 9); // FS.ReadBuffer(buf[1], 9);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 09:43
Die Funktion Low kann bei solchen Spielchen auch helfen, dass man nicht plötzlich, wenn man von dynamisch auf statisch (und bei 1 beginnend) umsteigt o.ä., Probleme bekommt
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#5

AW: Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 09:52
Hallo ihr drei!

Durch die kleine Änderung im Code funktioniert es jetzt einwandfrei.

Bisher hatte ich tatsächlich nur statische Arrays verwendet und habe mit FS.ReadBuffer(buf, sizeof(buf)); nie Probleme bekommen.
Warum das so ist, hab ich dank euch jetzt verstanden.
In Zukunft werde ich mir also FS.ReadBuffer(buf[0], sizeof(buf)); angewöhnen.

Vielen Dank an euch Deep-Sea, sx2008 und himitsu für die umfangreiche Erklärung :)

Ein schönes Wochenende!
Gruß Xoric
"Gods are fragile things; they may be killed by a whiff of science or a dose of common sense."
- Chapman Cohen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 10:14
Was Deep-Sea noch meinte war das:
FS.ReadBuffer(buf[Low(buf)], ...) .

Das nimmt sich dann immer den Anfang des Arrays, egal wie es definiert ist.


Aber ich schreibe auch fast immer die [0] hin, da es sich sowieso besser macht,
Arrays einheitlich zu deklarieren.

(nur bei einigen Sonderfällten macht sich ein einfacher Array-Anfang manchmal besser ... bei mir sind das z.B. Arrays, welche paralell zu Strings verarbeitet werden, welche dann mit [1..] beginnen, damit auch da die Zählung einheitlich ist)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Jul 2010 um 10:17 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#7

AW: Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 11:09
In Zukunft werde ich mir also FS.ReadBuffer(buf[0], sizeof(buf)); angewöhnen.
Na hoffentlich nicht! sizeof(buf) ist nämlich immer = 4!. Besser ist FS.ReadBuffer(buf[0], length(buf)*sizeof(buf[0])) .
  Mit Zitat antworten Zitat
XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#8

AW: Fehler bei TFileStream.ReadBuffer mit Buffer size

  Alt 2. Jul 2010, 15:55
Oh richtig
Bei dynamischen Arrays ist das ja die Größe des Pointers.
Ich hab die Größe des Buffers sowieso wie oben immer in einer Variable abgelegt.

Danke für den Hinweis gammatester!
"Gods are fragile things; they may be killed by a whiff of science or a dose of common sense."
- Chapman Cohen
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:03 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