CString verändern
-
Also mach doch einfach ne while-schleife mit m_strFile.Left und m_strFile.Right:
[/cpp]
int pos=-2;
int lange=m_strFile.GetLenght();
CString left,right;
while(pos<=m_strFile.GetLenght())
{
lange=m_strFile.GetLenght();
pos+=3;
left=m_strFile.Left(pos);
right=m_strFile.Right(lange-pos);
left+=" x0";
m_strFile=left+right;
}[cpp]
Ich hoffe ma das funktioniert so.MFG
Hansi
-
also hier noch ma mit code-tags hoffentlich:
int pos=-2; int lange=m_strFile.GetLenght(); CString left,right; while(pos<=m_strFile.GetLenght()) { lange=m_strFile.GetLenght(); pos+=3; left=m_strFile.Left(pos); right=m_strFile.Right(lange-pos); left+=" x0"; m_strFile=left+right; }
-
????
Irgendwie klappt das noch nicht ganz.
in left steht ja die Zeichenkette " x0" und nicht der BYTE-Wert Hex 0. Die Schleife funktioniert natürlich klasse.
Das eigentliche problem ist, das ich beim Schreiben jedes zweite Zeichen den Hex 0 Wert übergeben muß.
Ich will quasi eine XML-Datei nachprogrammieren. Leider wird bei der Original XML-Datei nach jeden zeichen der Hex-Wert gesetzt. Diesen kann ich aber nicht in einer Zeichenkette übergeben, da Hex 0 ja die Zeichenkette beendet.
Ich denke also, das die Übergabe des HexWertes beim Schreiben der Datei geschehen muß.Nur wie?????
-
Guck dir mal die iostreams an, damit müsste es mach bar sein.
ofstream o("myxml.xml"); for(int i =0; i < str.length();i++) o << str[i] << '\0'; o.close;
-
Funktioniert klasse. Vielen Dank

Aber noch eine klein Frage:
Wie kann ich die EscapeSequenz \n trennen?
\n = 0D 0A
\r = 0D
Wie bekomme in 0A?
Brauch ich alleinstehend.
habe schon versucht in einer if-Abfrage \n zu finden. Funktioniert aber leider nicht.
if(m_strXMLDatei[i] == "\n") o << '\0D' << '\0' <<'\0A' << '\0';Die Fehlermeldung lautet: error C2446: '==' : Keine Konvertierung von 'char *' in 'int'
-
if(m_strXMLDatei[i] == '\n**'**)
" durch ' austauschen
-
ja, hab ich auch gerade gefunden. Aber die If-Anweisung ist falsch.
da müssen nun die hexwerte rein. Ähnlich wie oben angegeben. Die Bytefolge muß sein: 0D 00 0A 00
also 00 ist leicht '\0'
aber irgendwie bekomme ich 0D und 0A nicht hin.
-
char chVergleich = 0x0D0A;Suchst du das hier?
-
Ich steh heut mal wieder total auf dem Schlauch.
Erklär bitte noch mal was Du machen willst.
Im moment suchst Du nach \n und gibst dann \0xd\0x0\0xa\0x0 aus.
Irgendwie erinnert mich das an MultiByte oder Unicode oder sowas in die richtung... Kann es eventuell sein das Du versuchst eine 16 Bit Zeichen Datei wie eine 8Bit Zeichen Datei zu bearbeiten ?
-
Das ist schon möglich.
Also folgendes:
ich habe mit Windows Media Encoder eine Datei namens Stream.wme erstellt.
mit dem Editor aufgemacht scheint es eine ganz normale XML Datei zu sein.
Diese habe ich nachprogrammiert, aber es läuft nicht.
Dann habe ich die Datei mit XVI.exe aufgemacht (Freewareprogramm). Hier habe ich dann gesehen, das die datei mif FF FE beginnt und nach jeden zeichen ein 00 kommt. Jetzt versuche ich das so nachzustellen. Hab auch mittlerweile fast alles. Nur wenn ich in meinen CString ein \n habe wird es 0D 0A übergeben.
In der Original-Datei wird diese Zeichenfolge aber auch durch ein 00 getrennt.
also 0D 00 0A 00
-
Haste mal CString::Replace mit "\n" und "\0xD\0x0\0xA\0x0" versucht ?
-
m_strXMLDatei.Replace("\n" , "\0xD\0x0\0xA\0x0");Klappt leider nicht. Dann habe ich überhabt kein 0D bzw. 0A mehr in meiner Datei.
-
Zeig mal die ganze Funktion.
Devil
-
// Damit der Anfang der Datei stimmt. ÿþ = Hex FF FE m_strXMLDatei = "ÿþ"; // String aus einen CStringArray str_XML[]) zusammensetzen for(int i = 0; i < str_XML.GetSize(); i++) m_strXMLDatei = m_strXMLDatei + str_XML[i]; // Versuch die Escapesequenz zu ändern. m_strXMLDatei.Replace("\n" , "\0xD\0x0\0xA\0x0"); // Datei schreiben mit '\0' nach jedem zeichen ( Ausnahme: die beiden ersten Zeichen ) ofstream o("C:\\stream.wme"); for(i =0; i < m_strXMLDatei.GetLength();i++) if(i < 2) o << m_strXMLDatei[i]; else o << m_strXMLDatei[i] << '\0'; o.close;
-
// Damit der Anfang der Datei stimmt. ÿþ = Hex FF FE m_strXMLDatei = "ÿþ"; // String aus einen CStringArray str_XML[]) zusammensetzen for(int i = 0; i < str_XML.GetSize(); i++) { if(str_XML[i]=='\n') m_strXMLDatei += "\0xD\0x0\0xA\0x0"; else m_strXMLDatei = m_strXMLDatei + str_XML[i]; } // Datei schreiben mit '\0' nach jedem zeichen ( Ausnahme: die beiden ersten Zeichen ) ofstream o("C:\\stream.wme"); for(i =0; i < m_strXMLDatei.GetLength();i++) if(i < 2) o << m_strXMLDatei[i]; else o << m_strXMLDatei[i] << '\0'; o.close;Versuchs mal so. Du musst das \n direkt beim 'kopieren' ersetzen.
Devil
-
Funktioniert leider auch nicht.
Ich habe gerade rumprobiert und was merkwürdiges rausgefunden.
m_strXMLDatei = "ÿþ"; for(int i = 0; i < str_XML.GetSize(); i++) m_strXMLDatei = m_strXMLDatei + str_XML[i]; char m_temp0xD = 0xD; char m_temp0xA = 0xA; ofstream o("C:\\stream.wme"); o.setmode(1); for(i =0; i < m_strXMLDatei.GetLength();i++) if(i < 2) o << m_strXMLDatei[i]; else if (m_strXMLDatei[i] == '\n') { //o << m_temp0xD << '\0'; //1 o << m_temp0xA << '\0'; //2 } else o << m_strXMLDatei[i] << '\0'; o.close();Wenn ich in der else if-Abfrage 1 und 2 ausführe, bekomme 0D 00 0D 0A 00.
Führe ich nur 2 aus bekomme ich 0D 0A 00.
Aber warum????
Normal ist das nicht. Es scheint so, als würde der Compiler ein 0D automatisch vor einem 0A setzen. Kann man das irgendwie abschalten / umgehen???
-
Schon mal CString durch std::string ersetzt ?
Devil
-
std::string?
was meinst du damit?
kann man vieleicht in der Datei o 2 Byte zurückgehen, das Byte dann löschen und wieder an das Ende der Datei gehen?
-
Ok ok erst lesen dann posten. std::string habe ich gefunden. könnte vieleicht auch klappen. aber wie verbinde dich zwie std::strings
m_strXMLDatei1 = m_strXMLDatei1 + str_XML[i]; funktioniert so nicht mehr.
-
mach mal einen static_cast<char>(str_XML[i]) evtl hilft das.
und += sollte schneller sein.Devil