AGB  ·  Datenschutz  ·  Impressum  







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

Einlesen einer r-Code Quelldatei

Ein Thema von pascalsg77 · begonnen am 29. Mär 2006 · letzter Beitrag vom 29. Mär 2006
Antwort Antwort
pascalsg77

Registriert seit: 11. Jul 2004
2 Beiträge
 
#1

Einlesen einer r-Code Quelldatei

  Alt 29. Mär 2006, 07:46
Hallo,

für mein kleines Suchprogramm (in Delphi) muss ich in allen Dateien eines Verzeichnisses und dessen Unterver-
zeichnissen nach einer bestimmmten Zeichenkette suchen. Bei normalen Textdateien funktioniert dies einwandfrei.
Jetzt muss ich aber .r-Dateien durchsuchen (compilierter Progressquelltext) und bekomme in meinem Memofeld
nur noch wenige Zeichen bestehend aus schwarzen Kästchen, Strichen, Balken - also total unsinniges Zeug angezeigt.
Öffnet man nun so eine Datei im Notepad, so ist der Inhalt der Datei richtig dargestellt (mehrere Zeilen Text),
und der String kann mittels Suche auch gefunden werden.

Zum Laden der Datei in meinem Programm habe ich bereits mehrere Verfahren ausprobiert: Readln(textdatei,String),
FileStream, StringStream, direktes laden des Textes durch Memo1.Lines.LoadFromFile(....) usw.
Auch versch. Komponenten habe ich eingesetzt: Memo, Richedit, SynEdit, TntMemo, AdvMemo von TmsSoftware.
Alles leider ohne Erfolg.

Einzig und allein die Datei als File of Byte zu deklarieren und dann jedes Byte einzeln einzulesen
und mittels Chr()-Funktion umzusetzen funktioniert. Jedoch dauert der Einlesevorgang ziemlich lange.

Es muss doch auch eine einfachere Möglichkeit geben, den Dateiinhalt mit all seinen (Steuer-)Zeichen einzulesen
und nach der Zeichenkette zu durchsuchen.

Als Beispiel habe ich mal so eine Datei angehängt, die auch nicht eingelesen werden kann.
Ggfs. hat einer von Euch ja bereits so ein Problem behandelt oder kennengelernt.
Angehängte Dateien
Dateityp: txt xp_bde01_733.txt (82,6 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Einlesen einer r-Code Quelldatei

  Alt 29. Mär 2006, 08:17
ich weiß nicht ob Dir das weiterhelfen wird, aber
auf Linuxkisten gibts es ein Kommando names strings
das extrahiert die lesbaren Zeichen aus x-beliebigen Dateien.

Ansonsten könnte Dir das hier weiterhelfen http://www.delphipraxis.net/internal...ct.php?t=26329

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Einlesen einer r-Code Quelldatei

  Alt 29. Mär 2006, 08:29
Herzlich willkommen in der Delphi-PRAXiS.

Da es sich bei deinen Dateien um Binärdateien handelt, du aber trotzdem die Literale absuchen möchtest, solltest du eine tabellengestützte Code-Konvertierung verwenden um alle uninteressanten Zeichen zu neutralisieren:

Delphi-Quellcode:
type
  TCodeTable = array [Byte] of Char;
var
  ct: TCodeTable;

procedure Translate(var s: String; ct: TCodeTable);
var
  i: Integer;
begin
  for i := 1 to Length(s) do
    s[i] := ct[Ord(s[i])];
end;

procedure InitTable(var ct: TCodeTable);
var
  i: Integer;
begin
  FillChar(ct, SizeOf(ct), ' ');
  for i := 33 to 126 do
    ct[i] := Chr(i);
end;
Mit inline assembler geht das noch effizienter.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
pascalsg77

Registriert seit: 11. Jul 2004
2 Beiträge
 
#4

Re: Einlesen einer r-Code Quelldatei

  Alt 29. Mär 2006, 11:19
Hallo Klaus,
Hallo marabu,

Ich hab jetzt das ganze direkt mit der tabellengestützten Code-Konvertierung
ausprobiert und es hat direkt bei dem ersten Mal funktioniert.

Vielen Dank an Euch.

Gruss
Pascal
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Einlesen einer r-Code Quelldatei

  Alt 29. Mär 2006, 11:43
Oder ohne Tabelle
Delphi-Quellcode:
procedure Translate(var s: String);
var
  i: Integer;
begin
  for i := 1 to Length(s) do
    if s[i] in [#0..#31, #127..#255] then s[i] := ' ';
end;
Natürlich kann man es auch so machen, daß nur die benötigten Zeichen übrig bleiben ^^

z.B.
if not (s[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '_']) then s[i] := ' ';
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 02:40 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