AGB  ·  Datenschutz  ·  Impressum  







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

Array of Char in String umwandeln

Ein Thema von Schwedenbitter · begonnen am 1. Nov 2013 · letzter Beitrag vom 1. Nov 2013
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Array of Char in String umwandeln

  Alt 1. Nov 2013, 11:54
Delphi-Version: 2006
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 BlockRead(); und einem 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 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 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 Str[I]:=CHR(Buff[I]); oder ähnlichem arbeiten - nur zur Not jedenfalls.

Wo liegt hier mein Denkfehler/meine Fehlvorstellung?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 12:00
Warum erzeugst Du Dir nicht einfach einen entsprechenden Record und machst den blockread direkt dahin?

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 12:24
Zitat:
Move(Buff[13], Pointer(Str), 20);
Du willst wirklich den Buffer-Inhalt in den String-Zeiger kopieren, anstatt in den String-Inhalt?


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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Nov 2013 um 13:10 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 12:42
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 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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 13:29
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 13:34
Wieso einfach, wenn es auch umständlich geht? Mit einer typisierten Datei fiele das ganze "gelesen"- und sonstige Geraffel komplett weg.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 13:37
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 13:40
Dann nützt Dir SizeOf(R) aber auch nichts.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 13:42
Dann nützt Dir SizeOf(R) aber auch nichts.
Am Ende der Datei schon.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Array of Char in String umwandeln

  Alt 1. Nov 2013, 19:29
Frickler unter sich
  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 20:36 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