string bearbeiten mit getline



  • Hallo,
    ich wollte ein Programm schreiben, dass einen vorhandenen string zeilenweise bearbeitet. Ich habe es bereits mit getline() versucht.
    Kurz zu meinem Programm:
    ich habe einen String, der über mehrere Zeilen geht, diesen will ich zeilenweise analysieren, sprich pro Zeile bestimmte Schlüsselwörter finden, dafür wollte ich die Funktion getline benutzen.

    derzeit sieht mein Programm wie folgt aus:

    int handleMessage(string buffer){

    cout << buffer << endl;
    string firstLine;
    getline(buffer.c_str(), firstLine, '\n');
    if(firstLine=="Version 1.0"){
    cout << "Protokoll 1.0" << endl;
    }
    cout << "error" << endl;
    return 0;
    }

    Wenn ich mein Programm starte erfolgt folgende Meldung: "keine passende Funktion für Aufruf von getline(const char*, std::string&, char) Kandidaten sind _ssize_t getline (char **,size_t *,FILE 😉
    Ich kann es mir einfach nicht erklären, ich habe bereits in mehrere Foren gelesen, dass man ganz simpel einen string einlesen kann, jedoch war alles bezogen auf eine Datei bzw eine Eingabe.
    es wäre super toll, wenn mir jemand helfen könnte.



  • Hast du schon in der Referenz geschaut, wie getline ausschaut? http://www.cplusplus.com/reference/string/string/getline/



  • ja aber so wirklich verstehe ich es nicht. muss dazu sagen, dass ich ein absoluter Anfänger bin.
    Ich verstehe das so, dass ich meinen string zunächst in einen istream umwandeln muss aber wie?



  • Ingenieurin schrieb:

    ja aber so wirklich verstehe ich es nicht. muss dazu sagen, dass ich ein absoluter Anfänger bin.
    Ich verstehe das so, dass ich meinen string zunächst in einen istream umwandeln muss aber wie?

    std::istringstream stream(buffer); // std::istringstream ist ein istream
    


  • Ingenieurin schrieb:

    Ich verstehe das so, dass ich meinen string zunächst in einen istream umwandeln muss aber wie?

    Ja du brauchst einen Stream. Stell dir ein Stream einfach als eine beliebige Menge irgendwelcher, hintereinanderstehender Zeicher vor. Da du etwas einlesen willst, brauchst du einen istream (i für input). Natürlich weiß der istream nicht, welche Zeichen er halten soll, das musst du ihm schon sagen. Kommen die Zeichen von einer Datei? Kommen sie von der Tastatur? Kommen sie sonstwo her? Wenn du ihm das gesagt hast, dann hält der istream alle Zeichen für dich bereit, die du nun verarbeiteten kannst. Du kannst ihm z.B. sagen, "gib mir eine Ganzzahl" oder "gib mir eine Zeichenkette". Wenn du nun willst, dass die Zeichen, die der istream für dich halten soll, aus deinem buffer kommen sollen, dann brauchst du einen istringstream . Ein stringstream simuliert praktisch eine Datei. Und wenn du nun eine Zeile aus deiner (simulierten) Datei haben willst, machst du einfach getline(istringstream,string) .



  • Klasse danke! habs nun verstanden!Ich versuch erstmal selber weiter ansonsten meld ich mich hiernochmal 🙂 DANKE!!!



  • Guten Morgen!
    Da bin ich wieder. Ich hab nochmal eine Frage zur Funktion getline().
    Die erste Zeile im buffer wird abgefragt ob sie "Version 1.0" lautet, so weit so gut. Wenn dies der Fall ist, so springe in die nächste Methode.
    Nun will ich, dass das Programm zeilenweise den Text nach Schlüsselwörtern durchsucht. In jeder Zeile kann ein Schlüsselwort sein, muss aber nicht.
    Ich denke, dass ich es mit einer while-Schleife machen sollte nur irgendwie weiß ich nicht ganz genau wie. Jede Zeile endet immer mit \n und das Ende des gesamten Textblockes endet immer mit \n\r\n.
    Derzeit sieht mein Programmausschnitt so aus:

    int handleVersion(string buffer){
    string actualLine;
    istringstream stream_2(buffer);
    while(getline(stream_2,actualLine){
    if(...?
    }
    return 0;
    }

    int handleMessage(string buffer){

    cout << buffer << endl;
    string firstLine;
    istringstream stream_1(buffer);
    getline(stream, firstLine, '\n');
    if(!strcmp(firstLine.c_str(), "Version 1.0\r")){
    handleVersion(buffer);
    }
    else
    cout << "error" << endl;
    return 0;
    }

    Würde mich sehr freuen, wenn mir jemand helfen kann!
    Danke schon mal im voraus. !



  • Also ich hab das Problem nun mit
    ...
    while(stream_2!=0){
    if(....
    ....
    }

    gelöst. 🙂


Log in to reply