CStdioFile lesen, ersetzen, schreiben



  • Moin,

    ich habe das Problem, dass ich beim lesen einer Datei (es handelt sich dabei um eine Counterstrike Demo [Video]) immer nur die erste Zeile zurückgegeben bekomme... Mein Ziel ist es, die Datei zu öffnen (in einen CString), bestimmte Wörter zu ersetzen und anschließend die Datei mit den Änderungen zu schreiben. Mein Ansatz sieht folgendermaßen aus:

    CStdioFile someFile;
    	CString meinString;
    		if(someFile.Open(m_demopath2, CFile::modeReadWrite | CFile::typeBinary))
    		{
    			while(someFile.ReadString(meinString))
    			{
    				meinString.Replace(_T("+showscores"), _T("-showscores"));
    				MessageBox(meinString);
    			}
    			someFile.Close();
    		}
    		else
    			MessageBox("Konnte nicht geöffnet werden...");
    

    Ums Schreiben hab ich mich noch nicht gekümmert.

    Bin für jede Hilfe dankbar. 🙂



  • hi,

    nimm mal lieber dafür die <iostream> und <fstream> header und lese dann mit :

    ifstream m_sConnFile(".\\XYZ.dat", ios::in);
            if(m_sConnFile.is_open())
    	{
    		//char tmpValue[10];
    		string tmpValue;
    		while(!(m_sConnFile.eof() ) ){
    
                    }
            }
    

    alles in den speicher laden (vielleicht auch nur stückweise wenn zu gross) und
    dann mit "ios::out" und ofstream ... schreiben



  • Hallo,

    ist das eine Text-Datei? Dann öffne die Datei auch im Text-Modus:

    CStdioFile someFile;
        CString meinString;
            if(someFile.Open(m_demopath2, CFile::modeReadWrite | CFile::typeText))
            {
                while(someFile.ReadString(meinString))
                {
                    meinString.Replace(_T("+showscores"), _T("-showscores"));
                    MessageBox(meinString);
                }
                someFile.Close();
            }
            else
                MessageBox("Konnte nicht geöffnet werden...");
    

    MfG



  • Leider ist es keine Textdatei... Wenn ich die Datei im Notepad öffne, sind dort lauter Kästchen drin...

    Hier mal ein Auszug der Datei:

    €¶¯´$2 4€€Ð Ð €ü ÂÕ¹¡…¹±•mÉt T ô €> ä ÀŒ-ìl  ô ô 
    // Edit: In der Zeile sind eigentlich noch ein paar Kästchen...

    Mittlerweile sieht meine Funktion so aus: Sie schreibt aber immer noch nur EINE Zeile in die Datei...

    CStdioFile someFile;
    	CStdioFile sfTempDatei;
    	CString meinString;
    
    	if(m_scoreboard)
    	{
    		if(someFile.Open(m_demopath2, CStdioFile::modeReadWrite) | CStdioFile::typeBinary)
    			{
    				sfTempDatei.Open("temp.dem", CStdioFile::modeCreate | CStdioFile::modeWrite | CStdioFile::typeBinary);
    				while(someFile.ReadString(meinString))
    				{
    					meinString.Replace(_T("+showscores"), _T("-showscores"));
    					sfTempDatei.WriteString(meinString);
    				}
    				someFile.Close();
    				sfTempDatei.Close();
    			}
          else
    				MessageBox("Konnte nicht geöffnet werden...");
    	}
    

    Weiß noch jemand Rat? 🙂



  • ok, das wollte ich nur geklärt haben...denn dann solltest du ReadString vergessen, denn eine Datei mit Binärdaten kennt keine Zeilen(-umbrüche), womit klar ist, daß das so nicht funktionieren kann. Du mußt das genaue Dateiformat kennen (ich kenne es z.B. nicht), und dann kann man die geeignete Methode zum Auslesen einsetzen. In diesem Falle ist Read das richtige Mittel, aber, wie gesagt, ohne genauere Infos, wie denn der Aufbau dieser .dem-Dateien ist (ich habe jetzt keine Lust, mit Google zu suchen 😃 ), kann man dir so nicht helfen, da mußt du schon die Infos suchen bzw. hier angeben.

    MfG



  • Es ist eine hexadezimale Datei. Diese muss ich auslesen, in String umwandeln, Wörter ersetzen, in Hexadezimal umwandeln und wieder in die Datei speichern. Ich hoffe das sind genug Informationen. 😃

    Ich habe das Forum schon durchsucht, aber ich werde aus den Beiträgen nicht schlau...

    // Edit:

    Wenn ich die Datei in VC++ .NET mit dem Binär-Editor aufmache, kann ich die Wörter lesen, die ich ändern möchte.

    Beispiel:

    0011ec40 | 2B 73 68 6F 77 73 63 6F 72 65 73 | +showscores


Log in to reply