CString verändern



  • // 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



  • Guten Morgen Devil,

    ich glaube ich habe mich gerade falsch ausgedrückt. An welche Position der Cursor springen soll, weiß ich. Nur nicht wie.
    o.seekp(o.eof-2) funktioniert ja nicht. Ich weiß nicht mal genau, of seekp die richtige Funktion dafür ist.



  • ok, also, seekp setzt den Zeiger relativ zum anfang der datei.
    Also Anfang + 2 währe dann das 2 Byte. Du musst also wissen wieviel
    Bytes du schon geschrieben hast, um dann dort direkt zu verändern.

    Devil



  • Danke für alles 🙂

    Hier der Code, so dass es funktioniert

    // Hex 00 nach jedem Zeichen setzen
    	char m_temp0xD = 0xD;
    	char m_temp0xA = 0xA;
    	int j;
    	ofstream o("C:\\stream.wme");
    	for(i =0, j=0; i < m_strXMLDatei1.length();i++,j++) 
    		if(i < 2)
    		{
    			o << m_strXMLDatei1[i];
    		}
    		else if (m_strXMLDatei1[i] == '\n')
    		{
    			o << m_temp0xD ;
    			o << m_temp0xA ;
    			o.seekp(j+1);
    			o << '\0';
    			o.seekp(j+3);
    			o << '\0';
    			j+=3;
    		}
    		else
    		{
    			o << m_strXMLDatei1[i] << '\0'; 
    			j++;
    		}
    	o.close();
    


  • Und für was genau ist das jetzt ?

    Devil



  • Jetzt kann ich die geschriebene Datei Stream.wme mit meinen Programm einlesen und so einen Stream zu einen Windows Media Server streamen. In der wme-Datei ist eine XML-Datei, die ich natürlich durch Variablen anpassen kann (z. B. Name, Server, Bitrate usw).
    Habs gerade schon mal probiert, es funktioniert.
    Sag mal, könntest Du mir vieleicht noch eine Frage beantworten???
    Es geht um ein ChildFenster, welches ich auf OnButtonclick() erzeugen möchte.
    Das Problem (Handle)hab ich hier gepostet.
    http://www.c-plusplus.net/forum/viewtopic.php?t=58818&highlight=



  • Auch mein Wissen kennt eine Grenze 😉
    Versuchs mal bei Google 🙂

    Devil


Anmelden zum Antworten