![]() |
[TStringList] Problem mit einer Datei (bricht zu früh ab)
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe folgende Datei (aus dem Editor kopiert):
GBX BUCR 0 $½ 0 $) 0 $ 0 $ 0 $ę ’’’’’’’’’’’’’’’’ 7PUDKCVe4OE64UDv8LH9tfCgBa @ Stadium xZise hjjghhgklk ? @ Day @ @ Nadeo ā <header type="challenge" version="TMc.5" exever="0.1.7.5"><ident uid="7PUDKCVe4OE64UDv8LH9tfCgBa" name="hjjghhgklk" author="xZise"/><desc envir="Stadium" mood="Day" type="Race" nblaps="0" price="386" /><times bronze="-1" silver="-1" gold="-1" authortime="-1" authorscore="0"/><deps><dep file="Any\Advertisement\SignRight.bik"/><dep file="Any\Advertisement\SignUp.bik"/><dep file="Any\Advertisement\SignWarning.bik"/><dep file="Any\Advertisement\SignWrongWay.bik"/><dep file="Any\Advertisement\TMSmallExit.bik"/><dep file="Any\Advertisement\Dynamic Ad1.dds"/><dep file="Any\Advertisement\Dynamic Ad2.dds"/><dep file="Any\Advertisement\Dynamic Ad3.dds"/><dep file="Any\Advertisement\pfeil_links.bik"/><dep file="Any\Advertisement\SignLeft.bik"/><dep file="Any\Advertisement\SignDown.bik"/><dep file="Any\Advertisement\PressForward.bik"/><dep file="Any\Advertisement\GamesserverAnim.bik"/><dep file="Any\Advertisement\Gamesserver.dds"/><dep file="Any\Advertisement\FullSpeed.bik"/></deps></header> | 2 0 $ ’) 0 $ @ Ą$ l ŽŹśJ ĄOĄ $h* Ą $) é -] Ķ^ `ź¤l 0 $PIKS?y ĶP} )< J Ü® mĶ|qĄp}\^ @ 7PUDKCVe4OE64UDv8LH9tfCgBaD @ StadiumYd xZise ThjjghhgklkQ@cDayM$@xdNadeo Tģ I a+` @(t PlatformWallPub2 ]@h $ \1mP Any\Advertisement\SignRight.bii h 7S+@(@ *A7BUp45(4I +y!74Warning4I(H@,I"8HrongWay4M(Lh9 TMSmallExi5(HN*4äDynamic Ad1.ddsp?,i(I t I24I (HlU ą(34I(I.|,M(µ t Lpfeil_links41(I .I7Lef5%(= <Down4}(=.<4 PressForward4M(M.M%3ĢGamesserverAnim4Y(Y.X4)X4y(I.H4ĄFullSpee0č^@0p LoopStart,|lČ“RoadMainSlopeStrat” ' @0NTov C@DDI @|Š GrassClip Ą? !0,É"Łę$Ž %øĢ\( &0 $’’’’ŽŹś Aus dieser Datei wollte ich die Pfade herausfiltern: <dep file="Any\Advertisement\SignRight.bik"/><dep file="Any\Advertisement\SignUp.bik"/><dep file="Any\Advertisement\SignWarning.bik"/><dep file="Any\Advertisement\SignWrongWay.bik"/><dep file="Any\Advertisement\TMSmallExit.bik"/><dep file="Any\Advertisement\Dynamic Ad1.dds"/><dep file="Any\Advertisement\Dynamic Ad2.dds"/><dep file="Any\Advertisement\Dynamic Ad3.dds"/><dep file="Any\Advertisement\pfeil_links.bik"/><dep file="Any\Advertisement\SignLeft.bik"/><dep file="Any\Advertisement\SignDown.bik"/><dep file="Any\Advertisement\PressForward.bik"/><dep file="Any\Advertisement\GamesserverAnim.bik"/><dep file="Any\Advertisement\Gamesserver.dds"/><dep file="Any\Advertisement\FullSpeed.bik"/> Dazu habe ich mir folgenden Code geschrieben:
Delphi-Quellcode:
Ergebnis ist:
procedure TForm1.Button1Click(Sender: TObject);
var slTrack : TStringList; begin if odTrack.Execute then begin slTrack := TStringList.Create; slTrack.LoadFromFile(odTrack.FileName); {...} end; end; Zitat:
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Es scheint so als ob .loadFromFile ein EOF erkennt.
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Könntest du sagen was ein EOF ist?
(Ich tippe mal auf "End of File"...) |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Zitat:
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Und wie kann ich es denn öfnfnen, wie der Editor? Der hat es ja immerhin geschafft :D
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Versuch mal die datei als Binärdatei zu behandeln und lade sie per Stream oder in einen Buffer.
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Genau ... eine Binärdatei sollte man nicht als Strings laden. Ein File oder MemoryStream dürfte das Richtige sein.
Florian |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Okay... Ich habe es so gemacht, bekomme aber eine nette AV. (Habe bisher noch nicht mit Streams gearbeitet)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var fsStream : TFileStream; Text : string; begin if odTrack.Execute then begin fsStream := TFileStream.Create(odTrack.FileName, fmOpenRead or fmShareDenyWrite); try fsStream.Seek(1, soFromBeginning); fsStream.Read(Text, fsStream.Size - 1); Showmessage(Text[1]); finally fsStream.Free; end; end; end; |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Das ist ja auch wieder nicht Sinn der Sache, wenn du den Buffer doch wieder in einen String lädst :wink:
Diese Funktion sollte dir helfen: ![]() Florian |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Ich verstehe aber irgendwie nicht den unterschied zwischen einen "array [0..10000] of Char" und einem "string"...
Weil, wie man der Datei entnehmen kann, gibt es das Suchwort öfters... |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Dein String wird aber wohl nicht richtig gesetzt. Vermutlich wird auf String[0] zugegriffen. Daher die AV beim Lesen des Strings. Das array[0..10000] besitzt ja aber den Null-Index, weshalb ein Zugriff darauf ja dann keine Probleme geben sollte.
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Zitat:
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Ich habe das jetzt so gemacht, wie ein anderer Beitrag aus der DSDT (
![]() Gibt es eine möglichkeit deinen Code so zu verändern, dass er nach einem Wort sucht und wie oft es schon vorkommen sollte? (Also z.B. wenn du "ABCDEABCDE" hast, dass er die Position des ersten Cs und des 2. Cs angibt?) |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Du könntest die Ergebnisse alle in eine StringList schreiben, dann den entprechenden Text aus dem Buffer entfernen und weitersuchen ... wie genau das geht, weiß ich aber auch nicht.
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Okay... Ich habe es jetzt so gelöst (und meinen Bedürfnissen angepasst):
Delphi-Quellcode:
TIntArray ist ein Integerarray!
function FindInFile(const FileName : string; SearchWord : string) : TIntArray;
var fs : TFileStream; Buffer : array [1..10000] of Char; Size : Integer; idx : Integer; i : Integer; begin SetLength(Result, 0); idx := 1; fs := TFileStream.Create(FileName, fmopenreadwrite or fmsharedenynone); try Repeat Application.ProcessMessages; Size := (Fs.Size - Fs.Position); if Size > 10000 then Size := 10000; Fs.ReadBuffer(Buffer, Size); for i := 1 to Size do begin if (Buffer[i] = SearchWord[idx]) then Inc(idx) else idx := 1; if (idx = Length(SearchWord)) then begin SetLength(Result, Length(Result) + 1); Result[High(Result)] := (fs.Position - Size) + i - idx + 1; idx := 1; end; end; until fs.Position >= fs.Size; finally fs.Free; end; end; Das größere Problem ist jetzt, dass ich auch noch den Wert benötige. Ich suche ja nach "<dep file="" und müsste nun an den Zwischenraum kommen (bis zum "/>)... Mal sehen, wie ich das mache! |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Pos und Copy sollten da helfen.
Florian |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Lol?
Kann es sein, dass er ein array of Char als String behandelt, wenn er einen String erwartet? |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Jepp. Ein String ist eigentlich auch nur ein array of Char. Halt nur normalerweise nicht nullterminiert.
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
So... Ich habe das jetzt noch weiter umgewandelt und dabei stoße ich auf ein Problem:
Delphi-Quellcode:
Und zwar funktioniert das Copy irgendwie net:
function GetSigns(const FileName : string) : TStrArray;
var fs : TFileStream; Buffer : array [1..10000] of Char; Size : Integer; // idx : Integer; i : Integer; BufferPos, StartPos : Integer; a : string; begin SetLength(Result, 0); // idx := 1; fs := TFileStream.Create(FileName, fmopenreadwrite or fmsharedenynone); try repeat Application.ProcessMessages; Size := (Fs.Size - Fs.Position); if Size > 10000 then Size := 10000; Fs.ReadBuffer(Buffer, Size); for i := 1 to Size do begin if Length(Result) = 0 then StartPos := 1; BufferPos := PosEx('<dep file="', Buffer, StartPos + 1); StartPos := BufferPos + 1; if (BufferPos > 0) then begin SetLength(Result, Length(Result) + 1); Result[High(Result)] := Copy(Buffer, BufferPos + 11, BufferPos + PosEx('"/>', Buffer, BufferPos)); end; end; until fs.Position >= fs.Size; finally fs.Free; end; end;
Code:
Das erhalte ich für Result[0] bei der anfangs erwähnten datei!
---------------------------
Autolocer --------------------------- Any\Advertisement\SignRight.bik"/><dep file="Any\Advertisement\SignUp.bik"/><dep file="Any\Advertisement\SignWarning.bik"/><dep file="Any\Advertisement\SignWrongWay.bik"/><dep file="Any\Advertisement\TMSmallExit.bik"/><dep file="Any\Advertisement\Dynamic Ad1.dds"/><dep file="Any\Advertisement\Dynamic Ad2.dds"/><dep file="Any\Advertisement\Dynamic Ad3.dds"/><dep file="Any\Advertisement\pfeil_links.bik"/><dep file="Any\Advertisement\SignLeft.bik"/><dep file="Any\Advertisement\SignDown.bik"/><dep file="Any\Advertisement\PressForward.bik"/><dep file="Any\Advertisement\GamesserverAnim.bik"/><dep file="Any\Advertisement\Gamesserver.dds"/><dep file="Any\Advertisement\FullSpeed.bik"/></deps></header> --------------------------- OK --------------------------- (PS: TStrArray = Stringarray) |
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Zitat:
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Zitat:
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Zitat:
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Zitat:
|
Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
Ähm... Könntet ihr bitte sagen, wo das Problem bei meinem Code liegt :P Das mit Buffer und String Chars etc. interessiert mich im Monent nicht :P
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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