![]() |
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:
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...
Inhalt := StringReplace(Inhalt, '''', 'NEW', [rfIgnoreCase + rfReplaceAll])
Was also tun?! Grüsse, Ricane |
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: |
Re: String lässt sich nicht in die Datei schreiben...
|
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:
Gruß
Inhalt := StringReplace6(Inhalt, #20, 'NEW', [rfIgnoreCase + rfReplaceAll])
Frank |
Re: String lässt sich nicht in die Datei schreiben...
Zitat:
Code:
, der Hexwert ist 20, den müsste man in Delphi aber als Char so schreiben:
#32
Code:
#$20
|
Re: String lässt sich nicht in die Datei schreiben...
Klar hast recht ich habs verdreht.
Gruß Frank |
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:
mfg.
Inhalt := StringReplace(Inhalt, #39, 'NEW', [rfIgnoreCase , rfReplaceAll])
maximov |
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 |
Re: String lässt sich nicht in die Datei schreiben...
Seh ich auch gerade :shock: ...hauptsache wir konnten ihm hilfen.(?)
|
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:
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. :(
showmessage(StringReplace(#100#98#0#85#105#122#151#100,#0,'',[rfReplaceAll]));
Was kann ich tun? |
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. |
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... |
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:
gut davor drücken können :wink:
FileStream.Read(ReturnStr[1],filestream.size);
Naja, mal schaun :) |
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:
und anschliessend überträgst Du in einer Schleife die eingelesenen Daten in ReturnStr.
// Annahme: #00 wird aus dem Ursprung gelöscht
ReturnStr := StringOfChar(#00,FileStream.Size); 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:
und schon hast Du das Gewünschte.
ReturnStr := trimright(ReturnStr);
|
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