AGB  ·  Datenschutz  ·  Impressum  







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

PChar auf Text-File zeigen lassen

Ein Thema von Jazzman_Marburg · begonnen am 10. Mai 2010 · letzter Beitrag vom 11. Mai 2010
Antwort Antwort
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

PChar auf Text-File zeigen lassen

  Alt 10. Mai 2010, 20:14
Hallo Zusammen!

Stecke mal wieder tief im Unwissen -- 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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: PChar auf Text-File zeigen lassen

  Alt 10. Mai 2010, 20:21
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

Re: PChar auf Text-File zeigen lassen

  Alt 10. Mai 2010, 20:31
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#4

Re: PChar auf Text-File zeigen lassen

  Alt 10. Mai 2010, 21:26
Ihr seid super!

Lieben Dank!

Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#5

Re: PChar auf Text-File zeigen lassen

  Alt 10. Mai 2010, 22:15
Ähmm...

Nochmal eine kleine Nachfrage zu:

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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#6

Re: PChar auf Text-File zeigen lassen

  Alt 10. Mai 2010, 22:32
Ein PChar zeigt auf das erste Zeichen deines Strings.
Deswegen benötigt der auch die Länge des Strings
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#7

Re: PChar auf Text-File zeigen lassen

  Alt 10. Mai 2010, 22:53
Achja, wieder was gelernt.

Danke & Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

Re: PChar auf Text-File zeigen lassen

  Alt 11. Mai 2010, 08:22
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: PChar auf Text-File zeigen lassen

  Alt 11. Mai 2010, 09:01
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:08 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