Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Array of Char in String umwandeln (https://www.delphipraxis.net/177342-array-char-string-umwandeln.html)

Schwedenbitter 1. Nov 2013 11:54

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:
BlockRead();
und einem
Delphi-Quellcode:
Array [1..1024] Of Char
auch klappt. Damit lese ich die gesamt 112 Byte große Datei aus und möchte jetzt den Titel in ein String umwandeln.
Ich habe das mit
Delphi-Quellcode:
Move(Buff[13], Str[1], 20);
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 ...

Ich habe dann hier in der DP gestöbert und es z.B. mit
Delphi-Quellcode:
Move(Buff[13], Pointer(Str), 20);
und diversen Varianten versucht. Es klappt aber trotzdem nicht.
Ich bilde mir ein, sowas schon einmal gemacht zu habe. Ich würde auch ungern eine Schleife durchlaufen lassen und dann mit
Delphi-Quellcode:
Str[I]:=CHR(Buff[I]);
oder ähnlichem arbeiten - nur zur Not jedenfalls.

Wo liegt hier mein Denkfehler/meine Fehlvorstellung?

Gruß, Alex

Mavarik 1. Nov 2013 12:00

AW: Array of Char in String umwandeln
 
Warum erzeugst Du Dir nicht einfach einen entsprechenden Record und machst den blockread direkt dahin?

Mavarik

himitsu 1. Nov 2013 12:24

AW: Array of Char in String umwandeln
 
Zitat:

Delphi-Quellcode:
Move(Buff[13], Pointer(Str), 20);

Du willst wirklich den Buffer-Inhalt in den String-Zeiger kopieren, anstatt in den String-Inhalt?
:roll:

Und hast du im String vorher auch gengend Speicher reserviert?

Zitat:

Es kommt aber immer eine Exception.
Es wäre natürlich zuviel erwartet, wenn man auch den Inahlt der Meldung erführt.



Delphi-Referenz durchsuchenSetString + Delphi-Referenz durchsuchenSetLen

Zitat:

Ich würde auch ungern eine Schleife durchlaufen lassen und dann mit Str[I]:=CHR(Buff[I]); oder ähnlichem arbeiten - nur zur Not jedenfalls.
Im Notfall ist das genau der falsche Weg.

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?

Schwedenbitter 1. Nov 2013 12:42

AW: Array of Char in String umwandeln
 
Zitat:

Zitat von Mavarik (Beitrag 1234141)
Warum erzeugst Du Dir nicht einfach einen entsprechenden Record und machst den blockread direkt dahin?

Danke für den Tipp!
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:
SetLength(Str, 30);
hat das Problem endgültig gelöst. Da muss man aber auch erstmal drauf kommen...

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

Mavarik 1. Nov 2013 13:29

AW: Array of Char in String umwandeln
 
OK

Nimm einfach einen Shortstring.

oder sowas

Delphi-Quellcode:
{$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;
So einfach...

Mavarik

DeddyH 1. Nov 2013 13:34

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.

Mavarik 1. Nov 2013 13:37

AW: Array of Char in String umwandeln
 
Zitat:

Zitat von DeddyH (Beitrag 1234166)
Wieso einfach, wenn es auch umständlich geht? Mit einer typisierten Datei fiele das ganze "gelesen"- und sonstige Geraffel komplett weg.

Klar... geht das "auch", aber so ist man variabler... Besonders wenn die zu "hackende" Recordlänge noch nicht feststeht...

Mavarik

DeddyH 1. Nov 2013 13:40

AW: Array of Char in String umwandeln
 
Dann nützt Dir SizeOf(R) aber auch nichts.

Mavarik 1. Nov 2013 13:42

AW: Array of Char in String umwandeln
 
Zitat:

Zitat von DeddyH (Beitrag 1234171)
Dann nützt Dir SizeOf(R) aber auch nichts.

Am Ende der Datei schon.:stupid:

Furtbichler 1. Nov 2013 19:29

AW: Array of Char in String umwandeln
 
Frickler unter sich :mrgreen:


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