Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PChar auf Text-File zeigen lassen (https://www.delphipraxis.net/151274-pchar-auf-text-file-zeigen-lassen.html)

Jazzman_Marburg 10. Mai 2010 19:14


PChar auf Text-File zeigen lassen
 
Hallo Zusammen!

Stecke mal wieder tief im Unwissen :gruebel: -- und hoffe wieder auf eure Hilfe.

Eine Funktion erwartet zwei Parameter: "aBuf: PChar; aLen: integer"

Nun möchte ich den Inhalt einer Text-Datei in aBuf, und ihre Länge in aLen laden - "laden" ist das falsche Wort, ich möchte das aBuf auf den Inhalt der Text-Datei und aLen auf die Länge zeigen.

Da ich mit PChar keine Erfahrung habe, meine Frage: Wie geht das wohl?

Muß ich die Text-Datei erst laden, und danach den aBuf "darauf zeigen" lassen... (und wenn ja -- wie?).

Bin über jeden Hinweis dankbar!

Vielen Dank & Gruß
Jazzman

shmia 10. Mai 2010 19:21

Re: PChar auf Text-File zeigen lassen
 
Es gibt da eine nützliche Funktion, mit der man eine Datei in einen String laden kann:
Delphi-Quellcode:
function FileToString(const FileName: string): AnsiString;
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Len := fs.Size;
    SetLength(Result, Len);
    if Len > 0 then
      fs.ReadBuffer(Result[1], Len);
  finally
    fs.Free;
  end;
end;
Und dann:
Delphi-Quellcode:
var
  aBuf: PChar;
  aLen: integer;
  s : AnsiString;
begin
  s := FileToString('testdatei.txt');
  aBuf := PAnsiChar(s);
  aLen := Length(s);
  ...
end;

PS: hier noch die Umkehrfunktion StringToFile():
Delphi-Quellcode:
procedure StringToFile(const FileName: string; const Contents: AnsiString);
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmCreate);
  try
    Len := Length(Contents);
    if Len > 0 then
      fs.WriteBuffer(Contents[1], Len);
  finally
    fs.Free;
  end;
end;

himitsu 10. Mai 2010 19:31

Re: PChar auf Text-File zeigen lassen
 
Ja, du mußt die Datei erst irgendwo in einen Puffer/Buffer laden.

Entweder mit einem TFileStream in einen eigenen Puffer laden
oder du nimmst einen TMemoryStream und kannst davon dann direkt den .Pointer (eventuell noch nach PChar casten) und .Size für die beiden Parameter deiner Funktion verwenden.

PS: zum Thema PChar ... Welche Delphi-Version nutzt du denn?
Denn ab Delphi 2009 solltes du aufpassen, da dort ein Char aus 2 Byte besteht.

Jazzman_Marburg 10. Mai 2010 20:26

Re: PChar auf Text-File zeigen lassen
 
Ihr seid super! :hello:

Lieben Dank!

Gruß
Jazzman

Jazzman_Marburg 10. Mai 2010 21:15

Re: PChar auf Text-File zeigen lassen
 
:gruebel: Ähmm...

Nochmal eine kleine Nachfrage zu:

Zitat:

Zitat von shmia
Delphi-Quellcode:
var
  aBuf: PChar;
  aLen: integer;
  s : AnsiString;
begin
  s := FileToString('testdatei.txt');
  aBuf := PAnsiChar(s);
  aLen := Length(s);
  ...
end;

Wenn ich das so einbaue, und die 'testdatei.txt' ist 13KB groß, dann sehe ich im Debugger, dass aBuf = 'ÿþD' (FFFE -- Unicode BOM), aber wo ist denn der Rest des Files?
Ich dachte aBuf zeigt auf den gesamten File und nicht nur auf die ersten 4 Bytes des Files?!

Oder missverstehe ich da was?

Danke nochmals!
Jazzman

Teekeks 10. Mai 2010 21:32

Re: PChar auf Text-File zeigen lassen
 
Ein PChar zeigt auf das erste Zeichen deines Strings.
Deswegen benötigt der auch die Länge des Strings :)

Jazzman_Marburg 10. Mai 2010 21:53

Re: PChar auf Text-File zeigen lassen
 
Achja, wieder was gelernt. :-D

Danke & Gruß
Jazzman

himitsu 11. Mai 2010 07:22

Re: PChar auf Text-File zeigen lassen
 
Zitat:

dann sehe ich im Debugger, dass aBuf = 'ÿþD' (FFFE -- Unicode BOM)
Der Debugger hält natürlich im PAnsiChar bei der ersten #0 an, da diese ja das Ende des AnsiString anzeigt (wenn man keine Längenangabe verwendet)
und bei einem UnicodeText in einem AnsiString kann es nunmal viele Nullen geben.

jaenicke 11. Mai 2010 08:01

Re: PChar auf Text-File zeigen lassen
 
Nebenbei: Mit MMFs kann man auch direkt mit dem Dateiinhalt arbeiten. Für so kleine Dateien ist das egal, aber wenn größere Dateien eingelesen und bearbeitet werden sollen, dann kann man damit eine sehr starke Leistungssteigerung erreichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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