Autor Beitrag
Force
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: Fr 15.12.06 19:44 
Hi, ich hab eine kleine Frage:

Ich hab mir jetzt zwar schon mehrere Filestream-Tutorials durchgelesen und auch in der Online-Hilfe nachgeschlagen, aber viel schlauer bin ich jetzt auch nicht - wie ist es möglich, von einer bestimmten Datei jeweils 20KB einzulesen und als Stream oder String zu speichern? Die Funktion müsste ungefähr so aussehen:

function xByteEinlesen(startbyte:byte,bytes:integer):TStream


Ich hab schon ein paar Sachen ausprobiert, aber der meckert sogar schon während dem Kompilieren :(

Kann mir vielleicht jemand erklären, wie ich diese Funktion schreiben kann? Oder wenn nicht, wo man ein leicht verständliches tutorial finden kann (ich hab schon DSDT etc ausprobiert)?


Wär echt nett,

Force
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 15.12.06 23:24 
Moin!

Du darfst TStream nicht direkt benutzen, das ist nur eine abstrakte Basisklasse als Grundlage; insofern ist der Rückgabeparameter der Funktion sicherlich nicht geeignet.

Aber wo ist denn das Problem, Daten aus einem Stream in z.B. einen String einzulesen? ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Datei: TFileStream;
  Str: String;
begin
  Datei:= TFileStream.Create(...);
  Datei.Position := 0; // oder was auch immer
  SetLength(Str, 20 *1024); // 20kb
  Datei.Read(PChar(Str),20 *1024);

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Force Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: Fr 15.12.06 23:52 
ah, ich bin blöd - ich hab vergessen, dass man ja die Position setzen kann user defined image

Ich hab das vorher immer versucht irgendwie in das Read mit reinzupacken ;)

Vielen Dank!! :))

Force
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 16.12.06 09:27 
Titel: Re: Jeweils 20KB einer Datei via Filestream oder FileRead le
Vergiss das freigeben mit Free aber nicht ;).

user profile iconForce hat folgendes geschrieben:
wie ist es möglich, von einer bestimmten Datei jeweils 20KB einzulesen und als Stream oder String zu speichern?


Also einen String würde ich dir abraten, denn sobald in der Datei ein #0-Char drin steht, hat der String da Probleme. Am besten ist immer ein array of Char oder array of Byte, z.B. geht auch:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  str: array of Char;
  FS: TFileStream;
begin
  try //Falls das öffnen der Datei fehlschägt
    FS:=TFileStream.Create('MyFileName', fmOpenRead);
    //FS.Position:=0; //Nach dem öffnen ist die Position sowieso schon 0...
    SetLength(str, 20*1024);
    FS.Read(str[0], 20*1024);
    Fs.Free;
  finally
    FS.Free;
  end;
  ShowMessage(String(str)); //liest das array als String aus
end;


Wobei man beim array of Char eigentlich nix gewinnt ;).
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 16.12.06 20:10 
Moin!

user profile iconHeiko hat folgendes geschrieben:
Also einen String würde ich dir abraten, denn sobald in der Datei ein #0-Char drin steht, hat der String da Probleme. Am besten ist immer ein array of Char oder array of Byte

Nein, das hat er nicht; lediglich stringverarbeitende Funktionen (wie z.B. StringReplace), die auf 0-terminierten Strings aufgebaut sind, könnten dann Probleme mit den Daten im String bekommen.

Wenn du den String nur als Datenlager verwenden willst, ist das unter Pascal schlicht egal, da Strings im Gegensatz zu C über Längenzähler verwaltet werden; aber Strings sind einfacher handzuhaben. ;)

Deshalb ist das hier absolut gleichwertig:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  Str: String;
  FS: TFileStream;
begin
  try // Falls das öffnen der Datei fehlschägt
    FS := TFileStream.Create('MyFileName', fmOpenRead);
    SetLength(Str, 20 *1024);
    FS.Read(PChar(Str), 20 *1024);
  finally
    FS.Free;
  end;

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 16.12.06 20:16 
user profile iconNarses hat folgendes geschrieben:
Wenn du den String nur als Datenlager verwenden willst, ist das unter Pascal schlicht egal, da Strings im Gegensatz zu C über Längenzähler verwaltet werden; aber Strings sind einfacher handzuhaben. ;)

Soweit ich mich erinnerete hatte bei Delphi auch nur der ShortString nen Zähler am Anfang, aber du hast Recht, ich habs gerade noch einmal nachgelesen ;):

Zitat:
Die acht Byte vor der Stelle enthalten eine Längenangabe und einen Referenzzähler von je 32 Bit.