Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Howto: Datei byteweise lesen und schreiben (https://www.delphipraxis.net/75741-howto-datei-byteweise-lesen-und-schreiben.html)

PASST 24. Aug 2006 10:53


Howto: Datei byteweise lesen und schreiben
 
Hi NG.

Delphi 4 (update 3)

Wie kann ich in einer Datei ein bestimmtes Byte auslesen und überschreiben?

Hintergrund ist, ich möchte bei einer dbase Datei an Byte 1C (der MDX-Flag) den Wert von 1 auf 0 ändern.

Gruß
Peter

Der_Unwissende 24. Aug 2006 11:07

Re: Howto: Datei byteweise lesen und schreiben
 
HI,
ich bin mir nicht 100%ig sicher, aber es gibt doch bestimmt schon TStream in D4?
Mit Streams kannst du genau das machen. Schau einfach mal in der OH nach TFileStream/TMemoryStream/TStream.

Gruß Der Unwissende

PASST 24. Aug 2006 11:37

Re: Howto: Datei byteweise lesen und schreiben
 
Stimmt, damit müsste es gehen. Leider kenne ich mich mit Streams nicht so gut aus, werde wohl ein wenig suchen udn tüfteln müssen.

Jetzt habe ich aber noch eine Verständnisfrage.
Ich möchte ja eine dbase Datei "manipulieren". Wenn ich mit einem TStream in Delphi die Datei an einem Byte ändern will, funktioniert das eigentlich doch so, dass ich den Stream bis zu diesem Byte lesen muss, das Byte anschließend ersetze, den Rest der Datei einlesen und wieder auf die Platte schreiben.

Ist das nicht ein wenig umständlich? Gibt es nicht die Möglichkeit, genau das gewünschte Byte zu verändern, ohne das alles gelesen und alles wieder geschrieben wird?

Gruß
Peter

kolbaschedder 24. Aug 2006 11:38

Re: Howto: Datei byteweise lesen und schreiben
 
Probier'S mal mit den nativen Dateiroutinen.
Ungefähr so.


Code:
procedure writeByte;
var f : integer;
    buffer : byte;
    nOffset : integer;
begin
  buffer := 0;
  nOffset := $1C;
  f := FileOpen('datei.xxx', fmOpenWrite);
  if f >= 0 then
  try
    fileSeek(f, nOffset, soFromBeginning);
    fileWrite(f,buffer, 1);
  finally
   fileClose(f);
  end;

end;

DGL-luke 24. Aug 2006 11:43

Re: Howto: Datei byteweise lesen und schreiben
 
mit streams würd so gehen:

Delphi-Quellcode:
procedure StreamSetByte(AFilename: string;APosition: Int64; AValue: Byte);
begin
  with TFileStream.Create(AFileName, fmOpenReadWrite) do //öffnen
    try
      Position := APosition;        //Position "suchen"
      Write(AValue, sizeof(AValue)); //Schreiben
    finally
      Free; //schließen
    end;
end;
Ich hoffe, die with...do und try..finally..end syntaxelemente sind dir geläufig.

EDIT: varibale entfernt, filemode geändert...

Der_Unwissende 24. Aug 2006 11:50

Re: Howto: Datei byteweise lesen und schreiben
 
Zitat:

Zitat von DGL-luke
mit streams würd so gehen:

Delphi-Quellcode:
var FS: TFileStream;
begin
  with TFileStream.Create(AFileName, fmOpenWrite) do //öffnen
Ich hoffe, die with...do .. syntaxelemente sind dir geläufig.

:mrgreen:

DGL-luke 24. Aug 2006 11:55

Re: Howto: Datei byteweise lesen und schreiben
 
Der Compiler macht das schon weg ;)

EDIT: hat er :mrgreen:

PASST 24. Aug 2006 13:38

Re: Howto: Datei byteweise lesen und schreiben
 
Vielen Dank euch allen, insbesondere an kolbaschedder. Seine Lösung passt per Copy Paste :)

Ich habe es zuerst als TFilestream versucht, aber es hat nicht geklappt. Habe ich hier am Code irgendwas falsch gemacht?
Delphi-Quellcode:
var
  FS: TFilestream;
  aFileName: String;
  aPosition: Longint;
  aValue: Byte;
begin

  aFileName := 'datei.dbf';
  aPosition := $1C;
  aValue := 0;
  with FS.Create(AFileName, fmOpenWrite) do //öffnen
    try
      Position := APosition;        //Position "suchen"
      Write(AValue, sizeof(AValue)); //Schreiben
    finally
      Free; //schließen
    end;

inherited 24. Aug 2006 13:44

Re: Howto: Datei byteweise lesen und schreiben
 
Zitat:

Zitat von DGL-luke
Delphi-Quellcode:
  with TFileStream.Create(AFileName, fmOpenWrite) do //öffnen

*hüstel*, müsste es nicht fmCreate oder fmOpenReadWrite sein, weil fmOpenWrite den bisherigen inhalt doch komplett ersetzt?

DGL-luke 24. Aug 2006 13:48

Re: Howto: Datei byteweise lesen und schreiben
 
Sicher? Das wäre ja... katastrophal...

Zitat:

fmOpenWrite
Die Datei wird ausschließlich zum Schreiben geöffnet. Beim Schreiben in die Datei wird der aktuelle Inhalt vollständig ersetzt.
Ja... tatsächlich... :oops:

wirs sofort korrigiert. Das ist aber nicht sehr sprechend...

fmOpenWriteAndDeleteEveryThingWhenIReallyWrite wäre passender :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.
Seite 1 von 2  1 2      

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