String einlesen mit getline



  • Hallo zusammen,
    ich moechte einen String mit getline einlesen und in einer string variable speichern. funktioniert so weit auch. allerdings kann ich bei der eingabe dann in der konsole nur eine bestimmte anzahl zeichen eingeben, wenn mein text zu lang ist geht es also nicht. kennt jemand eine lösung für das problem?
    Danke schonmal.


  • Mod

    Sofern du nicht mehrere Milliarden Zeichen eingibst, kann das nicht sein. Oder du meinst mit "String" keinen std::string sondern ein char-Array. Zeig mal Code.



  • Normalerweise macht man das so:

    #include <iostream>
    #include <string>
    int main()
    {
      std::string MeineZeile;
      std::getline(std::cin, MeineZeile);
    }
    


  • EOutOfResources schrieb:

    Normalerweise macht man das so:

    #include <iostream>
    #include <string>
    int main()
    {
      std::string MeineZeile;
      std::getline(std::cin, MeineZeile);
    }
    

    ok, ich glaube mein denkfehler liegt wo anders, denn ich mache es genau so wie du gepostet hast. ich vermute, getline liest eine zeile, bis zum zeilenumbruch oder? wenn ich also alle zeilen in einem string haben möchte müsste ich doch nur immer wieder getline aufrufen, und das eingelesene aneinander hängen, oder? wie kann ich aber prüfen wann die eingabe zuende ist, um die schleife abzubrechen?



  • Newbie001 schrieb:

    ich vermute, getline liest eine zeile, bis zum zeilenumbruch oder?

    Das ist der dritte Parameter von std::getline , welcher standardmässig '\n' ist. Und um alles in einen String zu schreiben:

    std::string Alles;
    while(!std::cin.eof())
    {
      char CurrChar;
      std::cin >> CurrChar;
      Alles.push_back(CurrChar);
    }
    


  • Du mußt mit dem Verwender des Programms ein Kennzeichen vereinbaren, wann die Eingabe beendet ist (z.B. eine Zeile ohne Inhalt). Ob der Nutzer die Eingabe beendet hat, kannst du dann an diesem Kennzeichen festhalten:

    string text = "";
    string zeile;
    while(getline(cin,zeile) && zeile!="")
    {
      text.append(zeile+'\n');
    }
    

    Eine radikale Lösung wäre Strg+Z als Eingabe-Ende, aber dann kannst du hinterher nichts mehr eingeben lassen.


  • Mod

    Newbie001 schrieb:

    ich vermute, getline liest eine zeile, bis zum zeilenumbruch oder?

    Ja, das ist der Zweck von getline.

    wenn ich also alle zeilen in einem string haben möchte müsste ich doch nur immer wieder getline aufrufen, und das eingelesene aneinander hängen, oder?

    😕 Das wäre eine Möglichkeit, aber warum dann überhaupt zeilenweise einlesen und nicht alles in einem Rutsch?

    wie kann ich aber prüfen wann die eingabe zuende ist, um die schleife abzubrechen?

    Wenn du versuchst über das Ende eines Stroms zu lesen, dann wird der Strom in einen Fehlerzustand versetzt. Das kann man einfach prüfen, indem man den Stream auswertet.



  • [quote="SeppJ"]

    Newbie001 schrieb:

    Das wäre eine Möglichkeit, aber warum dann überhaupt zeilenweise einlesen und nicht alles in einem Rutsch?

    weil ich die eingabe im string ohne die zeilenumbrüche haben möchte... aber dazu brauch ich irgendwie doch das ende der eingabe und das bekomm ich nicht hin.

    Gibts dazu in c++ nichts mit EOF oder dergleichen?



  • [quote="CStoll"]Du mußt mit dem Verwender des Programms ein Kennzeichen vereinbaren, wann die Eingabe beendet ist (z.B. eine Zeile ohne Inhalt). Ob der Nutzer die Eingabe beendet hat, kannst du dann an diesem Kennzeichen festhalten:

    string text = "";
    string zeile;
    while(getline(cin,zeile) && zeile!="")
    {
      text.append(zeile+'\n');
    }
    

    geht das nicht allgemeiner mit EOF irgendwie?



  • Newbie001 schrieb:

    CStoll schrieb:

    Du mußt mit dem Verwender des Programms ein Kennzeichen vereinbaren, wann die Eingabe beendet ist (z.B. eine Zeile ohne Inhalt). Ob der Nutzer die Eingabe beendet hat, kannst du dann an diesem Kennzeichen festhalten:

    string text = "";
    string zeile;
    while(getline(cin,zeile) && zeile!="")
    {
      text.append(zeile+'\n');
    }
    

    geht das nicht allgemeiner mit EOF irgendwie?

    do {
    	  getline(cin, input);
    	  cout << input << endl;
    	}while(cin.eof() == false) ;
    

    so hab ichs probiert, aber dann bekommt er das ende nicht mit und wartet auf den nächsten input.



  • Was für ein Buch hast du? Streams sollten zu den Grundlagen gehören! getline überspringt den Delimiter ohne ihn zu kopieren!



  • Newbie001 schrieb:

    geht das nicht allgemeiner mit EOF irgendwie?

    Ja, das geht. Nur wenn du aufhörst zu tippen, bekommst du noch lange kein EOF von der Standard-Eingabe. EOF kannst du je nach System mit Strg+Z (afair) provozieren, allerdings kenne ich keine Möglichkeit, die Standard-Eingabe danach wieder zu reaktivieren.

    (meine Schleife dort oben bricht bei Datei-Ende oder bei einer Leerzeile ab mit dem Lesen)


Anmelden zum Antworten