Text von der Komandozeile einlesen



  • Hallo Allerseits,

    ich bin grad frisch von JAVA auf C/C++ umgestiegen und habe mich an meinem ersten Programm versucht. Doch leider nicht ohne Probleme.
    Ich wollte ein einfaches Programm schreiben das einen gegebenen Text von der Kommandozeile einliest und wieder ausgibt:

    [cpp]
    #include <iostream>

    using namespace std;

    int main()
    {

    cout << "Programm started...." << endl;
    cout << "---------------------------------" << endl;

    char c;
    //int i=0;
    while(cin.get(c))
    // while(i<7)
    {
    //cin.get(c);
    cout << c ;

    //i++;
    }
    cout << endl;

    cout << "---------------------------------" << endl;
    return 0;
    }

    Die ganze Sache funktioniert ja eigentlich auch wunderbar doch leider geht er aus der Schleife nicht mehr raus....
    Habe es auch mit eof() versucht doch leider ohne Erfolg.

    Muss ich irgendwelchen Speicher freigeben???

    Vielen Dank

    Endorphie



  • Du hast keine richtige Endbedingung angegeben und deswegen bist du nicht mehr aus der while - Schleife gekommen.

    #include <iostream>
    using namespace std;
    int main()
    {
      cout << "Programm started...." << endl;
      cout << "---------------------------------" << endl;
      cout << "Press Escape to exit!" << endl << endl;;
    
      char c;
    
      while((cin.get(c)) != 27)
      {
        cout << c ;
      }
      cout << endl;
    
      cout << "---------------------------------" << endl;
      return 0;
    }
    

    MfG



  • sorry aber mein Compiler schluckt des nicht 😕

    wieso eigentlich 27?? cin.get(x) gibt doch false zurück wenn die eingabe beendet ist



  • #include <iostream>
    using namespace std;
    int main()
    {
      cout << "Programm started...." << endl;
      cout << "---------------------------------" << endl;
      cout << "Press Escape to exit!" << endl << endl;;
    
      char c;
    
      while((c = cin.get()) != 27)
      {
        cout << c ;
      }
      cout << endl;
    
      cout << "---------------------------------" << endl;
      return 0;
    }
    

    Also cin.get(c) gibt - wenn man so will - cin zurück.
    cin.get() gibt allerdings den gelesenen ASCII-Code zurück. Damit du ihn ausgeben kannst, musst du ihn zunächst in c speichern (dazu das (c = cin.get())). gleichzeitig willst du aber überprüfen, ob die Escapetaste gedrückt wurde (ASCII-Code 27). Daraus entsteht die auf den ersten blick seltsam erscheinende while-bedingung.



  • okay vielen Dank, habe deine Möglichkeit 1:1 übernommen doch leider bleibe ich immernoch in der schleife drin...

    Geht der Quellcode so bei dir??

    Ich benutze DevC++ mit dem Standard Compiler, falls das weiterhilft...



  • Drück mal nach ESC auf Enter. Dann sollte es klappen.
    Das hat folgenden Grund:
    Durch den aufruf von cin.get() wird eine Eingabe aufgefordert, die mit Enter beendet werden soll! Sprich: während der Eingabe steht das Programm beim ersten cin.get() aufruf. Nachdem endlich Enter gedrückt wurde, gibt cin.get() das erste Zeichen zurück, die anderen, die du aber eventuell gedrückt hast, stehen noch im puffer. Also wirst du beim zweiten aufruf von cin.get() gar nicht mehr zur eingabe aufgefordert, sondern cin.get() nimmt sich das nächste Zeichen aus dem Puffer.
    Beispiel:
    1. cin.get() -> Eingabe des Users, die mit Enter bestätigt wird. Die Eingabe sei mal "Hallo\ESC". Es wird 'H' zurückgegeben.
    2. cin.get() -> keine Eingabeaufforderung, da Daten im Puffer. Rückgabe: 'a'
    3. cin.get() -> keine Eingabeaufforderung, da Daten im Puffer. Rückgabe: 'l'
    4. cin.get() -> keine Eingabeaufforderung, da Daten im Puffer. Rückgabe: 'l'
    5. cin.get() -> keine Eingabeaufforderung, da Daten im Puffer. Rückgabe: 'o'
    6. cin.get() -> keine Eingabeaufforderung, da Daten im Puffer. Rückgabe: 'ESC'
    Da die Bedingung ungleich ESC lautete, bricht die schleife hier ab und das programm beendet sich.

    Was passiert wohl, wenn du "Hallo" (also ohne ESC) eingibst?



  • also laut deiner Definition müsste es abrechen aber leider bei mir nicht.

    Entweder check ich es gerade überhaupt nicht oder irgendwas stimmt bei mir nicht!?

    Ich gebe Hallo ein und er gibt es auch aus. Wenn ich Hallo eingebe und ESC drücke löscht er die Ausgabe....

    😕



  • Hm .. das muss jetzt an der "DosKonsole" liegen. Versuch mal statt while((c = cin.get()) != 27) while((c = cin.get()) != '.'). Nun ist die Abbruchbedingung der Punkt.



  • leider funktioniert das auch nicht....

    also es funktioniert nur wenn ich ein Punkt an das Ende schreibe, was ich aber eigentlich nicht will



  • Ich habe dir doch versucht zu erklären, warum das so ist!
    Was fällt dir bei diesem Programm auf?

    #include <iostream>
    
    int main(void) {
      std::cin.get();
      return 0;
    }
    

    Bevor du es testest, überlege dir, was es tut. Dann vergleiche mit dem, was wirklich passiert. Ich will jetzt nicht böse klingen, aber ich bin mir sicher, dass du was anderes erwartest.


Anmelden zum Antworten