Textdatei/ Teile eines Strings ändern



  • Hallo zusammen,
    ich versuche schon seit Tagen ein Programm zu schreiben, dass eine Datei einliest und meinen Vorgaben entsprechend ändert. In meinem Beispiel `ERSTENS==netter Text` würde ich gerne nur 'ERSTENS==' ersetzen. Es funktioniert aber nur dann, wenn ein Leerzeichen nach dem Gleichzeichen steht. Habt Ihr vielleicht eine Idee, wie es auch ohne Leerzeichen funktionieren könnte?
    Vielen Danke 🙂

    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    
        string old = "ERSTENS==";
        string neu = "1.";
    
        string old2 = "ZWEITENS==";
        string neu2 = "2.";
    
        string old3 = "drittens=";
        string neu3 = "3.";
    
        ifstream filein("test.txt");
        ofstream fileout("neu.txt");
        if(!filein || !fileout)
        {
            cout << "Error !" << endl;
            return 1;
        }
    
        string change;
    
        while(filein >> change)
        {
            if(change == old) change = neu;
            else if(change == old2) change = neu2;
            else if(change == old3) change = neu3;
    
            change += " ";
            fileout << change;
    
       }
    
        return 0;
    }
    

    Textdatei test.txt

    ERSTENS==netter Text
    ZWEITENS== ein anderer Text
    drittens=und noch mehr Text

    Ausgabedatei neu.txt

    ERSTENS==netter Text 2. ein anderer Text drittens=und noch mehr Text



  • cpp123 schrieb:

    Habt Ihr vielleicht eine Idee, wie es auch ohne Leerzeichen funktionieren könnte?

    Im Moment liest du String für String ein - wobei immer bis zum nächsten Leerzeichen oder Zeilenende gelesen wird. Deshalb funktioniert es nur, wenn auf z. B. "ERSTENS==" ein Leerzeichen folgt, da du ja anschliessend den gesamten String mit == vergleichst.

    Prüfe doch, ob der eingelesene Text mit deinem vorgegebenen String anfängt (den String zu ersetzen musst du dann anders machen, aber das findest du schon raus). Das kannst du mit std::string::find(..) machen. Vielleicht möchtest du mit std::getline(..) auch eher Zeilenweise einlesen?



  • Danke für die schnelle Antwort.
    Ich habe vor kurzem erst begonnnen, mich mit C++ zu beschäftigen und habe mit find noch keine Erfahrng, werde es aber versuchen. Funktioniert es denn mit meinem Code überhaupt nicht?



  • cpp123 schrieb:

    Funktioniert es denn mit meinem Code überhaupt nicht?

    Nein.

    Am besten gibst du einmal Zwischenresultate aus - z. B. change , dann kannst du sehen mit was du old , old2 und old3 vergleichst.

    Zusätzlich kannst du mit einem Debugger (z. B. Visual Studio, CodeBlocks, Eclipse...) den Code Anweisung für Anweisung durchgehen und dir die nötigen Überlegungen dazu anstellen.

    // Edit

    Mit std::getline(..) kannst du auch angeben, bis zu welchem Zeichen du lesen möchtest.