Such-Algorhytmus



  • Hi,

    mein Programm soll eine Datei öffnen und nach einem bestimmten Eintrag da drinne zu suchen. Hier ist der Code:

    Code:

    string aclient_inp_string;
    int i;
    ifstream aclient_inp;
    string diesername = path_folder + "ACLIENT.INP";
    aclient_inp.open(diesername.c_str());
    if(!aclient_inp)
    {
    cout<<"Klappt nicht."<<endl;
    }
    else
    {
    cout<<"geöffnet"<<endl;
    while(!aclient_inp.eof())
    {
    i = 0;
    cout<<"erste while-schleife"<<endl;
    getline(aclient_inp, aclient_inp_string);
    cout<<aclient_inp_string<<endl;
    while(i <= aclient_inp_string.length()-1)
    {
    cout<<"zweite while-schleife"<<endl;
    if(aclient_inp_string[i] == '#')
    {
    cout<<aclient_inp_string[i]<<endl;
    string zwischenspeicher = aclient_inp_string.substr(i+1, i+8);
    cout<<zwischenspeicher<<endl;
    if(zwischenspeicher == "Servername")
    {
    cout<<"GEFUNDEN"<<endl;
    cout<<zwischenspeicher<<endl;
    }
    }
    i++;
    }
    }
    }
    aclient_inp.close();

    Leider klappt es nicht ganz wie ich es mir vorgestellt habe. Mein Programm bricht mit einem Runtime Error ab.

    Das letzte was es ausgibt ist:
    zweite while-schleife
    zweite while-schleife
    zweite while-schleife

    Wie ihr gemerkt habt suche ich in meinem Prog nach "#", aber in der Datei befindet sich kein "#". Deswegen frag ich mich wieso es am Ende "#" ausgibt. Kennt jemadn vielleicth einen besseren Such-Algorhytmus?



  • Erstens: sfds

    Zweitens: Statt den String manuell zu durchforsten, solltest du lieber die String-Methode find() dafür verwenden 😉

    Drittens: Was ist denn die letzte Dateizeile, die vor dem Absturz (und dem Paket "zweite while-Schleife") ausgegeben wurde? Eventuell solltest du direkt nach dem getline() nochmal überprüfen, ob die letzte Eingabe gültig war (oder du auf EOF gestoßen bist)

    PS: Und nur der Vollständigkeit halber: Der zweite Parameter von string::substr() gibt die Länge des ausgeschnittenen Abschnittes an



  • Ich habe deinen Tip befolgt und find() benutzt. klappt perfekt. meine nächste Frage ist:
    Ich muss in einem String wo ein Platzhalter (befindet sich ca in der Mitte des Strings) steht etwas einfügen. Dieses etwas ist aber nicht genauso lang wie der Platzhalter. Also würde es mit replace() nicht funktionieren. Kennt jemand da auch eine tolle Funktion oder soll ich mit substr() bisschen rumbasteln?



  • Klar funktioniert das mit replace() (die Methode von std::string verschiebt die Teile außerhalb des ersetzten Blockes selbsttäig, um Platz für den Ersatztext zu schaffen (oder Lücken zu füllen).



  • kannste da nicht einfach bis zum platzhalter kopieren und dann die teile zusammenfügen?



  • könnte ich machen, aber dafür kann ich nicht substr() benutzen. weil der 2. Parameter nur die Länge des Strings ist.



  • Wie ich schon sagte - replace() kann den String verlängern/verkürzen:

    string test = "Dies ist ein Test";
    test.replace(9,3,"kein");
    cout<<test;
    

    (außerdem kannst du den zweiten Parameter von substr() weglassen - dann geht der Teilstring von der angegebenen Position bis zum Ende)

    PS: Wenn du mehr über den Umgang mit Strings wissen willst, empfehle ich dir meinen Artikel "Stringverarbeitung in C++" im Magazin.


Anmelden zum Antworten