Announcement

Collapse
No announcement yet.

Blockread/Blockwrite Bytes lesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Blockread/Blockwrite Bytes lesen

    Hallo Forum,

    aus der Delphi 5 Hilfe werde ich einfach nicht schlau.
    Unteres Beispiel aus der Hilfe funktioniert zwar, aber wie stellt
    man es denn an, wenn man aus einer beliebigen Datei ein Byte lesen
    und den Wert ermitteln möchte und mit Seek(?) den Zeiger auf die nächste Position setzt bis zum Dateiende ? So zusagen Byteweises einlesen und
    abarbeiten.
    Wer könnte mir ein kleines Beispiel nennen ?

    MfG
    Uwe

    var

    FromF, ToF: file;
    NumRead, NumWritten: Integer;
    Buf: array[1..2048] of Char;
    begin
    if OpenDialog1.Execute then { Dialog zum Dateiöffnen anzeigen }
    begin
    AssignFile(FromF, OpenDialog1.FileName);
    Reset(FromF, 1); { Datensatzgröße = 1 }
    if SaveDialog1.Execute then { Dialog zum Speichern anzeigen }
    begin
    AssignFile(ToF, SaveDialog1.FileName); { Ausgabedatei öffnen }

    Rewrite(ToF, 1); { Datensatzgröße = 1 }
    Canvas.TextOut(10, 10, 'Kopieren von ' + IntToStr(FileSize(FromF))
    + ' Byte...');
    repeat
    BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
    BlockWrite(ToF, Buf, NumRead, NumWritten);
    until (NumRead = 0) or (NumWritten <> NumRead);
    CloseFile(FromF);
    CloseFile(ToF);
    end;
    end;
    end;

  • #2
    <br>Hi,...
    <br>
    <br>seek funktioniert nur bei Typisiertendateien. Mit Blockread/write bearbeitet man untypisierte Dateien. Wenn du in dem obigen Beispiel Byte weise einlesen willst , so mußt du Buf: array[1..2048] of Char; auf Buf: array[1..1] of Char; setzen (so kann man das obige Beispiele am schnellsten umändern)
    <br>nach dem "BlockRead(FromF, Buf, SizeOf(Buf), NumRead);" kannst du dann auf Buf zugreifen und Änderungen vornehmen.
    <br>
    <br>mfg
    <br>p

    Comment


    • #3
      Besten Dank, werde das sofort testen.

      MfG
      Uw

      Comment


      • #4
        Das ist nicht ganz richtig..<BR>
        <B>procedure</B> Seek(var F; N: Longint);<BR>
        <I>"Seek sollte nur verwendet werden, um typisierte oder <B>nicht
        typisierte</B> Dateien zu öffnen.
        F ist eine typisierte oder <B>nicht typisierte</B> Dateivariable und N
        ein Ausdruck des Typs Longint."</I> (Zitat aus der Delphi-Hilfe)<BR>

        Allerdings brauchst du die Function Seek gar nicht wenn du die Datei
        Byteweise abarbeiten willst, da nach dem Aufruf von BlockRead die
        Position des Zeigers in der Datei aktualisiert wird. Wenn du nun also
        1 Byte einliest und den Zeiger um 1 weitersetzt wird nur jedes zweite
        Byte gelesen.
        Noch ein Tip am Rande. Lies nicht nur einzelne Bytes sondern Blöcke
        von mehreren KB ein. Das ist um einiges schneller!!

        Motz

        Comment


        • #5
          Hi

          Ich würde gänzlich auf die alten MS-DOS like Funktionen verzichten, und auf Stream ausweichen.

          <pre>

          var
          DatenByte: Byte;
          begin
          with TFileStream.Create('c:\tst.bin', fmOpenRead or fmShareDenyNone) do
          try
          Position := 1234;
          Read(DatenByte, SizeOf(DatenByte));
          finally
          Free;
          end;
          end;

          </pre>

          Gruß Hage

          Comment


          • #6
            <br>@Motzi:
            <br>das mit dem <b>nicht typisierte</b> habe ich wohl immer verdrängt/vergessen/nicht beachtet ...
            <br>
            <br>@Hagen:
            <br>welchen vorteil hab eich durch die Streams?
            ist das schneller oder so?
            <br>
            <br>mfg
            <br>p

            Comment


            • #7
              Hi

              Streams sind logischer, komfortabler, Objecte, kompatible untereinander, einfacher und alle guten VCL Komponenten und Objecte sollten Streams unterstützen. Sie sind nicht langsammer als BlockRead aber meistens schneller, da man ja Spezialstreams nutzen kann die intern automatisch Dateizugriffe cachen, völlig transparent für Dich.
              Streams sind die von Borland propagierte und unterstützte Methode !!

              Streams benötigen aber einen höheren Overhead, da die Unit Classes mit eingebunden wird, Streams sind Objectorientiert also ein Schwachpunkt für denjenigen der nur prozedural programmieren kann.

              Gruß Hage

              Comment


              • #8
                Hallo Hagen,

                genau das war das Gesuchte.
                Danke auch an die anderen, zwecks Typisierungen der Dateien.

                MfG
                Uw

                Comment

                Working...
                X