CString verändern



  • 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



  • for(int i = 0; i < str_XML.GetSize(); i++)
    		m_strXMLDatei1 += static_cast<char>(str_XML[i]) ;
    

    error C2440: 'static_cast' : 'class CString' kann nicht in 'char' konvertiert werden

    Gibt es vieleicht ein std::stringarray oder so was ähnliches?



  • hm, dann CString::GetBuffer(0);

    Devil



  • CString::GetBuffer()???
    Anstelle des CStringArray oder wie meinst du das?

    Ups, ich muß leider dringend weg. Meine Frau und meine beiden Kinder stehen schon unten vor der Tür und warten auf mich. Meine Tochter hat Geburtstag (3 Jahre).
    Würde mich freuen, wenn ich dich morgen wieder hier im Forum treffe.
    Bis dahin aber erstmal Vielen Dank und Schönen Abend 😃



  • CString::GetBuffer()???
    Anstelle des CStringArray oder wie meinst du das?

    Ups, ich muß leider dringend weg. Meine Frau und meine beiden Kinder stehen schon unten vor der Tür und warten auf mich. Meine Tochter hat Geburtstag (3 Jahre).
    Würde mich freuen, wenn ich dich morgen wieder hier im Forum treffe.
    Bis dahin aber erstmal Vielen Dank und Schönen Abend 😃



  • str_XML[i].GetBuffer(0);

    Das mein ich 😉

    Devil



  • Hi devil,

    mit GetBuffer(0) bleibt es leider auch dabei, das 0D 0A nicht getrennt werden können. Ich glaub die einzige Möglichkeit ist nach der Übergabe von OD 0A zwei Positionen zurückzuspringen, das Zeichen 0D löschen und dann wieder ans Ende der Datei springen. Könnte vieleicht mit seekp() funktionieren, doch wie setzt man da die Parameter ein?
    Ich dachte da an

    for(i =0; i < m_strXMLDatei1.length();i++) 
    		if(i < 2)
    			o << m_strXMLDatei1[i];
    		else if (m_strXMLDatei1[i] == '\n')
    		{
    			o << m_temp0xD;
    			o << m_temp0xA << '\0';  // Zeichenfolge jetzt 0D 0D 0A 00
    			o.seekp(of.eof -3); // Cursor 3 Byte zurück
    			o << '\0';   // Zeichenfolge jetzt 0D 00 0A 00
    			o.seekp(of.eof);	// Cursor ans Dateiende
    		}
    		else
    			o << m_strXMLDatei1[i] << '\0'; 
    	o.close();
    

    Aber die Steuerung innerhalb der Datei stimmt noch nicht.



  • Hm, papier und bleistift, und gucken wie man springen muss.
    Dazu kann ich dir nicht viel sagen 😉

    Devil


Anmelden zum Antworten