Meine C++-Fragen (Anfänger)



  • Guten Tag!
    Ich habe ein mehr oder weniger kleines Problem.

    #include <string>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    using namespace std;
    
    void wroten(std::string ersatz);
    bool stopit;
    
        std::string Ersetzer(const std::string &Suchstring, const std::string &stringErsetzer, std::string ZuErsetzendesGebilde)
        {
                std::string::size_type pos = ZuErsetzendesGebilde.find(Suchstring, 0);
                int intLengthSearch = Suchstring.length();
    
                while(std::string::npos != pos)
                {
                        ZuErsetzendesGebilde.replace(pos, intLengthSearch, stringErsetzer);
                        pos = ZuErsetzendesGebilde.find(Suchstring, pos + intLengthSearch);
                        wroten(ZuErsetzendesGebilde);
                };
                return ZuErsetzendesGebilde;
        };
        fstream write_file;
    
    void wroten(string ersatz)
    {
        if (!stopit)
        {
            write_file.open("Auflistung.txt");
            write_file << ersatz << endl;
            write_file.close();
            stopit;
        };
    };
    
        void ersetzen (ifstream file, string quelle , string Suchobjekt, string Ersetzung)
        {
            ;
            while (!file.eof())
    		{
                getline(file,quelle);
                if (quelle==Suchobjekt)
                {
                    //Suchobjekt->Ersetzung
                };
    		};
        };
    
          void find_and_replace( string &source, string find, string replace )
          {
            size_t j;
            for ( ; (j = source.find( find )) != string::npos ; )
            {
                source.replace( j, find.length(), replace );
            };
          };
    
    int main()
    {
        string search = "\\NPC\\";
        string replace = "\\NPC\\NPC_RuestungsFunctions.txt\n";
        ifstream read_file("Auflistung.txt");
        string linebuffer;
    
            while (!stopit)
    		{
    		    zaehler++;
                getline(read_file,linebuffer);
                cout << linebuffer << endl;
                Ersetzer(search,replace,linebuffer);
                //Ersetzer("\r\n","",stringToReplace);
            };
            cout << endl;
        read_file.close();
    };
    

    Wenn man den Code verwendet, dann funktioniert er zwar - jedoch fehlerhaft.
    Normalerweise sollte er in dieser Datei hier

    AI\ORC\ZS_ORC_TA.txt
    AI\ORC\Grunzer_*.txt
    AI\ORC\Arten_ORC.txt
    AI\ORC\TESTORC.txt
    AI\ORC\TESTORCSLAVE.txt

    STORY\NPC\BAU*.txt
    STORY\NPC\BORG*.txt
    STORY\NPC\CS*.txt

    Besser gesagt die erste darin enthaltene Zeile, inder \NPC\ vorkommt, durch diese hier ersetzen:

    STORY\NPC\NPC_RuestungsFunctions.txt

    Allerdings kommt dies hier dabei heraus:

    STORY\NPC\NPC_RuestungsFunctions.txt
    CS*.txt

    C\Arten_ORC.txt
    AI\ORC\TESTORC.txt
    AI\ORC\TESTORCSLAVE.txt

    STORY\NPC\BAU*.txt
    STORY\NPC\BORG*.txt
    STORY\NPC\CS*.txt

    Wie man sehen kann ist das, alsob man versucht mit aktiver "Einfügetaste" einen Geldbetrag in einer Datei zu ändern: Katastrophal!

    Nun weiß ich langsam nicht mehr weiter.
    Kennt von euch jemand die Lösung meines Problemes?

    Nochmal zur Erläuterung:
    Das Programm soll nur eine Zeile tatsächlich austauschen und den Rest lassen, wie er ist.

    mfg for (I=I'm; i>0; i++)



  • Dein Programm ist insgesamt recht wüst.
    z.B.
    - Einrückung
    - Nach Funktionen, for-Schleifen etc. gehört kein Semikolon
    - was ist stopit? "stopit;" bewirkt überhaupt nichts
    - Variablendeklaration mal eben irgendwo dazwischen
    - Funktionen ersetzen() und find_and_replace() werden gar nicht aufgerufen (geposteten Code bitte aufs wesentliche beschränken)
    - "zaehler" gibt's noch nicht mal

    Zu deinem Problem:
    Du öffnest in der Funktion wroten() deine Datei ein zweites mal, d.h. der Filepointer steht am Anfang der Datei, deshalb wird dein Ersatzstring auch dahin geschrieben.
    Mach eine komplett neue Datei auf, in die du falls in einer Zeile nichts zu ersetzen ist, den Originaltext schreibst, ansonsten den geänderten Text. Zum Schluss alte Datei löschen und neue umbenennen nach "Auflistung.txt"



  • hüstel schrieb:

    - Variablendeklaration mal eben irgendwo dazwischen

    Hm, ich dachte bisher Variablendeklarationen sollte man erst dann machen, wenn man die Variable braucht. Stimmt das oder ist das schlechter Stil?

    Gruss
    Cartman



  • Eric Cartman schrieb:

    hüstel schrieb:

    - Variablendeklaration mal eben irgendwo dazwischen

    Hm, ich dachte bisher Variablendeklarationen sollte man erst dann machen, wenn man die Variable braucht. Stimmt das oder ist das schlechter Stil?

    Gruss
    Cartman

    stimmt ^^



  • fstream write_file; 
    
    void wroten(string ersatz) 
    { 
        if (!stopit) 
        { 
            write_file.open("Auflistung.txt"); 
            write_file << ersatz << endl; 
            write_file.close(); 
            stopit; 
        }; 
    };
    

    Du brauchst write_file aber nicht da sondern da:

    void wroten(string ersatz) 
    { 
       fstream write_file; 
    
        if (!stopit) 
        { 
            write_file.open("Auflistung.txt"); 
            write_file << ersatz << endl; 
            write_file.close(); 
            stopit; 
        }
    }
    

Log in to reply