std::getline wird nach Lesen von stdin übersprungen



  • Ich versuche in meinem Programm von stdin zu lesen. Das Programm wird wie folgt aufgerufen:

    ./project <<< "foobar"
    

    Nun habe ich das Problem, dass std::getline einfach übersprungen wird, was bei einem normalen Aufruf ( ./project ) nicht passiert.

    #include <iostream>
    
    int main(){
        char c;
        while(std::cin.get(c) && c != '\n');
    
        std::string line;
        std::getline(std::cin, line);
    }
    

    Ich habe auch schon folgende beiden Zeilen ausprobiert:

    std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Mit dem gleichen Ergebnis.
    Wie also mach ich das, wenn ich will, dass man std::cin ein weiteres Mal benutzen kann?



  • Sorry, stdin übersehen.



  • Willst du sowas:

    % (echo "foobar"; cat) | ./project
    

    Denn das stdin ist ja umgebogen und ist leer nachdem das foobar konsumiert ist.



  • wob schrieb:

    Willst du sowas:

    % (echo "foobar"; cat) | ./project
    

    Denn das stdin ist ja umgebogen und ist leer nachdem das foobar konsumiert ist.

    echo foobar|./cppProject und ./cppProject <<< "foobar" müsste doch eigentlich das Gleiche bewirken. Gut, aber wie mache ich std::cin dann wieder valide für die nächste Input-Operation? Den Status auf goodbit setzen und X Zeichen extrahieren hat nicht funktioniert.



  • Beachte das zusätzliche cat bei mir.

    Du kannst nicht einfach irgendein Handle "valide machen" und dann erwarten, dass Tastatureingabe rauskommt. Wenn du dagegen von (echo "bla"; cat) liest, bekommst du nach dem bla noch wieder das ursprüngliche stdin. Genaugenommen liest du dann die ganze Zeit vom selben Eingabestrom (nämlich dem des Prozesses, der die Klammern ausführt und dir nacheinander unterschiedliche Dinge gibt).



  • Beachte das zusätzliche cat bei mir.

    Ja, damit scheint es zu klappen. Aber geht das nicht schöner und auch noch C++-Intern?
    Ansonsten schonmal danke für die Antworten.


Anmelden zum Antworten