AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Blockread mal wieder

Ein Thema von dazar_t · begonnen am 14. Feb 2008 · letzter Beitrag vom 15. Feb 2008
Antwort Antwort
Seite 1 von 3  1 23      
dazar_t

Registriert seit: 1. Dez 2007
Ort: NRW
118 Beiträge
 
Delphi 2007 Professional
 
#1

Blockread mal wieder

  Alt 14. Feb 2008, 22:21
Guten Tag
Mir ist die funktion BlockRead bekannt und so wie ich es nun verstanden habe läuft es so ab :
BlockRead(FILE,BUFFER,WIEVIELE ZEICHEN MAN LESEN WILL); aber z.B in diesem Code
Delphi-Quellcode:
var
  f,t: file of byte;
  buf: array[1..4096] of byte;
  read: Integer;
begin
  assignfile(f, 'Y:\Datei1.exe');
  assignfile(t, 'C:\Datei1.exe');
  reset(f);
  rewrite(t);
  while not eof(f) do
  begin
    blockread(f, buf, length(buf), read);
    blockwrite(t, buf, read);
    Progressbar1.Position:=round(100*(filesize(t)/filesize(f)));
    Application.ProcessMessages;
  end;
  closefile(f);
  closefile(t);
wird read ja nirgends einen wert zugewiesen wieviele zeichen ließt er den dann und warum ?
Daniel
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Blockread mal wieder

  Alt 14. Feb 2008, 22:43
Liess dir doch einfach mal die Hilfe durch, dann sollte das klar sein.

procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]); Wird der gesamte Block übertragen, ist AmtTransferred mit Count identisch.

Ist AmtTransferred kleiner als Count, wurde vor Beendigung der Übertragung das Dateiende erreicht. In diesem Fall gibt AmtTransferred die Anzahl der vollständig gelesenen Blöcke zurück, wenn die Datenblockgröße der Datei größer als 1 ist.
  Mit Zitat antworten Zitat
dazar_t

Registriert seit: 1. Dez 2007
Ort: NRW
118 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Blockread mal wieder

  Alt 14. Feb 2008, 22:51
danke für deine antwort aber ganz ehrlich ist mir es immer noch nicht ganz klar

Weil z.B in dem Code ist ja noch garkein block gelesen ( In diesem Fall gibt AmtTransferred die Anzahl der vollständig gelesenen Blöcke zurück, wenn die Datenblockgröße der Datei größer als 1 ist.)

oder wird dan jeder block zurück gegeben ?
Daniel
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Blockread mal wieder

  Alt 14. Feb 2008, 22:55
Ok, ich versuche es nochmal...

Count ist immer gleich AmtTransferred, am Ende wird AmtTransferred < Count und enthält dann die wirklich gelesene Zeichenanzahl.
  Mit Zitat antworten Zitat
dazar_t

Registriert seit: 1. Dez 2007
Ort: NRW
118 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Blockread mal wieder

  Alt 14. Feb 2008, 23:01
Also ich habe noch ein tutorial gefunden dort wird dieser Code gezeigt
Delphi-Quellcode:
procedure OpenArchivFile(ArchivName: string; var ArchivFile: ArchivTyp);
var I, q: Integer;
  Size: LongInt;
  AktPos: integer;
  s: string;
  SSize: byte; // Länge des Strings
begin
  ArchivFile.FileStart:=TStringList.Create;
  ArchivFile.FileNames:=TStringList.Create;

  if not FileExists(ArchivName) then Exit;

  AssignFile(ArchivFile.ArchivFile, ArchivName);
  ReSet(ArchivFile.ArchivFile,1);

  { Erste Datei }
  BlockRead(ArchivFile.ArchivFile, SSize, SizeOf(SSize));
  // zuerst wird ausgelesen, wie groß der Dateiname ist
  SetLength(s,SSize);
  // dann wird S diese Länge zugewiesen
  BlockRead(ArchivFile.ArchivFile,s[1],SSize);
  // anschließend kann der Dateiname aus der Archivdatei
  // ausgelesen werden.

  BlockRead(ArchivFile.ArchivFile,Size,SizeOf(Size));
  // die Größe der Datei

  ArchivFile.FileNames.Add(s);
  // der Dateiname
  ArchivFile.FileStart.Add(IntToStr(SSize+SizeOf(SSize)+SizeOf(Size)));
  // wo beginnen die Daten der ersten Datei?

  AktPos:=SSize+SizeOf(SSize)+SizeOf(Size)+size;
  // an welcher Stelle in der Archivdatei befinden wir uns gerade:
  // am Anfang der 2. Datei (+size)
z.B : BlockRead(ArchivFile.ArchivFile, SSize, SizeOf(SSize));
der müsste doch dann einen Block lesen der EIN Byte groß ist oder ?!

Ich glaube ich komme nicht dahinter
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Blockread mal wieder

  Alt 14. Feb 2008, 23:02
Du hast eine typisierte Datei. Geht da überhaupt BlockRead
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Blockread mal wieder

  Alt 14. Feb 2008, 23:07
Da wird der 4 Parameter nicht verwendet. Dann hat man auch diese Information nicht. Ist ja auch ok, der Parameter ist ja optional. Das bedeutet, es wird einfach die Size-Größe aus der Datei gelesen, ferig.

Wie man blockread am besten einsetzen kann, hängt immer davon ab, was man machen will. Schau dir also nicht irgendwelche Beispiele an, sondern schau dir die Delphi-Hilfe an.
  Mit Zitat antworten Zitat
dazar_t

Registriert seit: 1. Dez 2007
Ort: NRW
118 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Blockread mal wieder

  Alt 14. Feb 2008, 23:18
Ich glaube ich habe einfach meine frage falsch Formuliert. Mich interresiert was z.B bei diesem Code BlockRead(ArchivFile.ArchivFile,SSize,SizeOf(SSize )); Dieses Sizeof(Size) bringt da doch SSize nie eine Zahl zugeorfnet wird. Sorry wenns langsam lästig wird

Habe grade gemerkt das das mit dem READ nicht gemeint war
Daniel
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Blockread mal wieder

  Alt 14. Feb 2008, 23:21
SSize ist der Buffer, in den die Inhalte, die BlockRead liest geschrieben werden.
Damit BlockRead weiss wie groß der Buffer ist, wird dies über sizeof(Buffer) übergeben.
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#10

Re: Blockread mal wieder

  Alt 14. Feb 2008, 23:22
SSize ist ein Byte. Folglich ist SizeOf (SSize) = 1. Also liest er ein Byte. Zusatz: Man kann statt SizeOf (SSize) auch SizeOf (Byte) schreiben. Das wäre das gleiche. Man nutzt deswegen SizeOf, um Plattformkompatibilität zu gewährleisten, da nicht 100% gewährleistet ist, dass auf allen System ein Byte immer 1 groß ist.

In deinem Beispiel oben wird die Größe der zu lesenden Bytes durch die Größe des Arrays vorgegeben. buf: array[1..4096] of byte = length(buf) = 4096.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 23:42 Uhr.
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 by Thomas Breitkreuz