Entwickler-Ecke

Dateizugriff - Datei Byteweise einlesen und in String speichern


-Lucky- - So 04.05.08 13:42
Titel: Datei Byteweise einlesen und in String speichern
Erst einmal ein nettes Hallo meinerseits, bin neu hier.

Bevor jetzt jemand kommt, das Thema hatten wir schon X-Mal, nein, ich habe gesucht und keine direkte Antwort auf meine Fragen gefunden. :shock:

Problem: Ich möchte eine x beliebige Datei nehmen, und die einzelnen Bytes alle einzeln einlesen, dass sie in einem String temporär zwischengespeichert werden. Umgekehrt soll es auch möglich sein, das String wieder als Datei abzuspeichern.

Es ist möglich, den Inhalt einer Datei in ein Memofeld zu laden, alles kein Problem. Aber ich möchte die einzelnen Bytes als Ascii Zeichen direkt in einem String haben, z.B. von einer Exe Datei. Inkl. den Steuerzeichen, also die nicht Buchstaben.

Zum einen könnte man das über TFileStream lösen, aber hier die Zeichen in String umzuwandeln dauert sehr lange, kann auch sein dass meine Prozedur einfach nur uneffektiv ist, da ich auf jedes Zeichen einzeln zugreife. :cry: Kann man gleich alles mit einmal in ein String packen? :?:

Also ich suche eine schnelle Prozedur, wie ich eine x-Beliebige Datei in ein String packen kann, und den Text dann wieder als Datei abspeichern kann.

Für eure Hilfe wäre ich sehr dankbar^^


Delete - So 04.05.08 20:04

Das was du vorhast geht natürlcih nur mit reinen Textdateien. Andere Dateien beinhalten nämlich auch Steuerzeichen, die man nicht als Zeichen darstellen kann. Und um auf einzelne Zeichen einer Zeichenkette zugreifen zu können, kannst du das Zeichen einfach mit dessen Index innerhalb des Strings ansprechen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  s: String;
begin
  s := 'Hello world';
  ShowMessage(s[1]);  // 'H'
  ShowMessage(s[3]);  // 'l'

Und wenn du den ordinalwert, also den ASCII-Wert haben willst, dann kannst du einfach Ord benutzen.


jaenicke - So 04.05.08 20:47

Zudem gibt es TStringStream oder TStringList, die beide die Möglichkeit bieten den Inhalt einer Datei einzulesen. Bei TStringStream hast du einen String mit dem kompletten Dateiinhalt, bei TStringList hast du eine Liste mit den Zeilen als Strings.


-Lucky- - Di 06.05.08 11:47

user profile iconLuckie hat folgendes geschrieben:
Das was du vorhast geht natürlcih nur mit reinen Textdateien. Andere Dateien beinhalten nämlich auch Steuerzeichen, die man nicht als Zeichen darstellen kann.


Spielt doch keine Rolle, ich will die ja einfach nur ins String speichern und dann quasi ganz normal mit dem String arbeiten. Die 32 Steurzeichen kann man ruhig ignorieren, das was ich vorhabe funktioniert so auch. Nur möchte ichs auch mit externen Dateien machen. Denn das Steuerzeichen #10 kann man auch in ein String speichern, er speichert sich dann die 8 1en und 0en für die 10 und nicht das Zeichen direkt. Darum ist dies auch möglich.

Mit TStringStream gabs leider einige Probleme was den Zugriff angeht. Ich werds noch mal probieren obs für das was ich vorhabe doch funktioniert und mich dann melden.


jaenicke - Di 06.05.08 12:17

Wenn es keine Textdatei ist macht ein Zugriff mit einem String doch gar keinen Sinn. Warum nimmst du dann nicht einen TFileStream und greifst z.B. byteweise auf die Daten zu? Bei Binärdaten macht das eigentlich mehr Sinn.


-Lucky- - Di 06.05.08 18:15

Na weil ich dann den ganzen Quellcode umändern müsste... Habe die Daten bislang anders erzeugt, und es wird an duzende Stellen auf Strings zugegriffen. Das geht außerdem sehr schnell und ist, das Wichtigste, sehr einfach!

Aufgrund dessen ist es besser es mit string zu machen, dann brauch ich nur das Einlesen der Daten ändern und das Abspeichern, was ich jetzt gemacht habe, der Rest geht von alleine! :D

Andernfalls hätte ich das ganze Programm von Grund auf umschreiben müssen, so genau möchte ich das jetzt jedoch nicht erklären. Passt schon :wink: