Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String lässt sich nicht in die Datei schreiben... (https://www.delphipraxis.net/13055-string-laesst-sich-nicht-die-datei-schreiben.html)

Ricane 10. Dez 2003 11:08


String lässt sich nicht in die Datei schreiben...
 
Moin,

ich will einen String in eine TIniFile schreiben.

Das Problem: Der String hat an der fünften Stelle einen "'". Daher werden immer nur die ersten vier Stellen weggeschrieben und nicht der ganze Rest.

Also dachte ich mir das ich mit StringReplace das ganze modifizieren könnte ... und zwar so:

Delphi-Quellcode:
Inhalt := StringReplace(Inhalt, '''', 'NEW', [rfIgnoreCase + rfReplaceAll])
Klappt nur leider nicht. Er ersetzt das "'" nicht, bzw. nicht an allen Stellen. Den mit den anderen StringReplace Funktionen die es hier gibt, werden zwar einige ersetzt, aber nicht alle. Also habe ich mir den String nochmal in einem HEX Editor angeguckt und da steht an der fünften Stelle statt "'" nur " ". Der Ascii Code dafür ist 00, also kein "echtes" Leerzeichen. In Delphi zeigt er aber ein "'" an...

Was also tun?!


Grüsse,

Ricane

Akut-Programming 10. Dez 2003 11:19

Re: String lässt sich nicht in die Datei schreiben...
 
Hi!

Kann man in Delphi überhaupt mit "" arbeiten?? :gruebel: Der arbeitet doch glaube nur mit einzelnen Anführungszeichen. ('') Oder verwechsle ich es jetze?? :roll:

Akut-Programming 10. Dez 2003 11:24

Re: String lässt sich nicht in die Datei schreiben...
 
Hab ma n bissl die DP durchsucht, schau dir dochma das Thema an. Vielleicht hilfts ja. ;o)

Greetz,

Sourcemaker 10. Dez 2003 11:34

Re: String lässt sich nicht in die Datei schreiben...
 
Hi,

also du hast statt einem Leerzeichen #20 ein #0 dann ersetzt halt mit:

Delphi-Quellcode:
Inhalt := StringReplace6(Inhalt, #20, 'NEW', [rfIgnoreCase + rfReplaceAll])
Gruß

Frank

scp 10. Dez 2003 12:59

Re: String lässt sich nicht in die Datei schreiben...
 
Zitat:

Zitat von Sourcemaker
Hi,

also du hast statt einem Leerzeichen #20 ein #0 dann ersetzt halt mit:

Delphi-Quellcode:
Inhalt := StringReplace6(Inhalt, #20, 'NEW', [rfIgnoreCase + rfReplaceAll])
Gruß

Frank

Ein Leerzeichen hat einen dezimalen Wert von 32, als Char also
Code:
#32
, der Hexwert ist 20, den müsste man in Delphi aber als Char so schreiben:
Code:
#$20

Sourcemaker 10. Dez 2003 13:25

Re: String lässt sich nicht in die Datei schreiben...
 
Klar hast recht ich habs verdreht.

Gruß

Frank

maximov 10. Dez 2003 13:27

Re: String lässt sich nicht in die Datei schreiben...
 
Ganz davon abgesehen wollte Ricane das '-zeichen ersetzen -> #39

Desweiteren denke ich, das dies hier nicht stimmt: [rfIgnoreCase + rfReplaceAll]

siehe definition: TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

womit [rfIgnoreCase + rfReplaceAll] sowas wie 0+1 ist, also nur 1 bei rauskommt -> also nur rfIgnoreCase!

mach es einfach so:

Delphi-Quellcode:
Inhalt := StringReplace(Inhalt, #39, 'NEW', [rfIgnoreCase , rfReplaceAll])
mfg.
maximov

Sourcemaker 10. Dez 2003 13:58

Re: String lässt sich nicht in die Datei schreiben...
 
Hi Maximov,

ich denke es ging um #32 bzw. #0 was er ja mit Hex-Editor gefunden hat.
Mit der StringReplace-Syntax hast du sicherlich recht habe ich auch nur von Ricane ohne Prüfung übernommen.

Gruß

Frank

maximov 10. Dez 2003 14:17

Re: String lässt sich nicht in die Datei schreiben...
 
Seh ich auch gerade :shock: ...hauptsache wir konnten ihm hilfen.(?)

nur-ein-weiterer-thunder 13. Mär 2004 19:38

Re: String lässt sich nicht in die Datei schreiben...
 
Hmm, ich glaub eher, es war eher folgendes gemeint:
(mein Problem, daß ich grad hab - sry, daß ich damit störe :oops: )

Delphi-Quellcode:
showmessage(StringReplace(#100#98#0#85#105#122#151#100,#0,'',[rfReplaceAll]));
Hintergrund: Ich hab mir ne Datei in einen Filestream gelesen und wollte jetzt mittels StringReplace Ersetzungen darin vornehmen. Solange in der Datei kein hexadezimaler Nullwert (#0) auftaucht, ist das auch absolut kein Problem mit StringReplace, leider verweigert mir die Funktion die Zusammenarbeit, sobald sie im FileStream auf #0 trifft. :(
Was kann ich tun?

Christian Seehase 13. Mär 2004 20:42

Re: String lässt sich nicht in die Datei schreiben...
 
Moin Thunder,

erst einmal herzlich Willkommen hier in der Delphi-PRAXiS.

Das Problem ist, dass StringReplace intern AnsiPos verwendet um die Position des zu ersetzenden Zeichens zu finden.
AnsiPos benutzt AnsiStrPos, eine Funktion für nullterminierte Strings.
Es wird also geprüft, ob der String zu Ende ist, also ein Nullbyte auftaucht, was bei jedem gefundenen Muster, dass mit einer #00 beginnt der Fall ist, und somit können solche Muster nicht gefunden werden.

Die Einzige Abhilfe wäre hier sich das StringReplace selber zu erstellen.

Dani 13. Mär 2004 20:42

Re: String lässt sich nicht in die Datei schreiben...
 
Hi,
Kannst du nicht schon beim Einlesen mit dem Filestream die #0-Zeichen ersetzen? Du könntest die Daten z.B. zuerst in einem Puffer speichern und diesen per for-Schleife durchgehen, bevor der Puffer an den Ergebnis-String angehängt wird...

nur-ein-weiterer-thunder 13. Mär 2004 21:07

Re: String lässt sich nicht in die Datei schreiben...
 
Erstmal Dank euch beiden, so wie es aussieht, werd ich also um eine FOR-Schleife nicht drumherum kommen :?
Bisher hab ich mich nämlich durch
Delphi-Quellcode:
FileStream.Read(ReturnStr[1],filestream.size);
gut davor drücken können :wink:

Naja, mal schaun :)

Christian Seehase 13. Mär 2004 23:12

Re: String lässt sich nicht in die Datei schreiben...
 
Moin Thunder,

Du kannst auch weiterhin so einlesen, am besten dann aber in eine Hilfsvariable.
Das eigentliche Ziel initialisierst Du dann

Delphi-Quellcode:
// Annahme: #00 wird aus dem Ursprung gelöscht
ReturnStr := StringOfChar(#00,FileStream.Size);
und anschliessend überträgst Du in einer Schleife die eingelesenen Daten in ReturnStr.
Hierbei brauchst Du dann noch eine Variable als Index für ReturnStr[..], und lässt immer die #00 weg beim Übertragen.

Zum Schluss noch ein

Delphi-Quellcode:
ReturnStr := trimright(ReturnStr);
und schon hast Du das Gewünschte.


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