![]() |
Delphi-Version: 2006
Array of Char in String umwandeln
Hallo,
ich habe einige Meta-Dateien. In diesen sind diverse Daten und im "Klartext" immer an derselben Stelle die Namen von Filmen enthalten. Die möchte ich auslesen, was mit
Delphi-Quellcode:
und einem
BlockRead();
Delphi-Quellcode:
auch klappt. Damit lese ich die gesamt 112 Byte große Datei aus und möchte jetzt den Titel in ein String umwandeln.
Array [1..1024] Of Char
Ich habe das mit
Delphi-Quellcode:
versucht. Es kommt aber immer eine Exception. Die Position passt (mit Hex-Editor ermittelt) und ich habe es zur Sicherheit auch schon mit 12 und 14 probiert ...
Move(Buff[13], Str[1], 20);
Ich habe dann hier in der DP gestöbert und es z.B. mit
Delphi-Quellcode:
und diversen Varianten versucht. Es klappt aber trotzdem nicht.
Move(Buff[13], Pointer(Str), 20);
Ich bilde mir ein, sowas schon einmal gemacht zu habe. Ich würde auch ungern eine Schleife durchlaufen lassen und dann mit
Delphi-Quellcode:
oder ähnlichem arbeiten - nur zur Not jedenfalls.
Str[I]:=CHR(Buff[I]);
Wo liegt hier mein Denkfehler/meine Fehlvorstellung? Gruß, Alex |
AW: Array of Char in String umwandeln
Warum erzeugst Du Dir nicht einfach einen entsprechenden Record und machst den blockread direkt dahin?
Mavarik |
AW: Array of Char in String umwandeln
Zitat:
:roll: Und hast du im String vorher auch gengend Speicher reserviert? Zitat:
![]() ![]() Zitat:
Wenn man was "komplizierteres" und Fehleranfälliges nicht ganz versteckt, dann sollte man lieber etwas "Einfacheres" verwenden, welches kaum Probleme verursachen kann. Und warum ist Buff eigentlich kein Record im passenden Format? |
AW: Array of Char in String umwandeln
Zitat:
Dieser ist zwar mehr oder weniger ein Workaround und würde bei riesigen Dateien nichts bringen. Der Tipp hat aber den Denkansatz gegeben. Denn als es mit Array einigermaßen klappte (String war aus welchem Grund auch immer nur 8 Zeichen lang), wollte ich es direkt mit Seek und einem String probieren. Das knallte wieder und es fiel mir wie Schuppen von den Augen: Wenn ich S als String definiere, hat er eine Länge von 0. Das muss eine Zugriffsverletzung geben, weil move in nicht reservierten Speicher 30 Zeichen schreiben will. Ein
Delphi-Quellcode:
hat das Problem endgültig gelöst. Da muss man aber auch erstmal drauf kommen...
SetLength(Str, 30);
Ich mache es jetzt ohne Umweg und lese ohne Array gleich direkt in den String. Das ist am alleroberelegantesten. [edit] Himitsu war schneller. Mich verblüfft bloß, dass hier im Forum einige Themen mit String und move zu finden sind, mir aber das SteLength(); völlig durch die Lappen gegangen war. [/edit] Gruß & Dank, Alex |
AW: Array of Char in String umwandeln
OK
Nimm einfach einen Shortstring. oder sowas
Delphi-Quellcode:
So einfach...
{$A1}
MyRec = Record KeineAhungwashiersteht : Array [1..10] of Byte; Name : String[12]; KeineAhungwashiersteht2 : Array [1..112] of Byte; end; Var I : Integer; F : File; R : myRec; begin assignfile(F,'Daten.dat'); reset(F,1); try while not(eof(f)) do begin Blockread(F,R,Sizeof(R),gelesen); if gelesen = Sizeof(R) then begin R.Name[0]:= #12; // Falls kein Längenbyte oder nach einer Endmarke suchen whatever! Memo1.Lines.Add(R.Name); end; end; finally Closefile; end; end; Mavarik |
AW: Array of Char in String umwandeln
Wieso einfach, wenn es auch umständlich geht? Mit einer typisierten Datei fiele das ganze "gelesen"- und sonstige Geraffel komplett weg.
|
AW: Array of Char in String umwandeln
Zitat:
Mavarik |
AW: Array of Char in String umwandeln
Dann nützt Dir SizeOf(R) aber auch nichts.
|
AW: Array of Char in String umwandeln
Zitat:
|
AW: Array of Char in String umwandeln
Frickler unter sich :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz