Frage zu while (cin)

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Boris_partys
Beiträge: 14
Registriert: 20. Februar 2012 06:22

Frage zu while (cin)

Beitrag von Boris_partys »

Hallo zusammen

Ich habe eine Frage zu einem Codebeispiel von Stroustrup.

Stroustrup verwendet einen Schleifenausdruck

while (cin).

Insgesamt schaut das so aus:

while (cin) {

Token t = get_token();
tok.push_back(t);

cout<<endl;

for (int i = 0; i<tok.size(); i++)
cout<<tok.value<<endl;

}

Das funktioniert auch so weit. Nur, dass die Schleife eben nie beendet wird. das teste ich über eine cout ausgabe nach der Schleife:

cout<<"das ist ein Test"<<endl;

Was mache ich hier falsch, warum steigt mir das Programm nicht aus der Schleife aus, wenn der cin eingelesen wurde. Z.B. 3+2*3??

Kann mir jemand helfen??

Vielen Dank und noch einen schönen Sonntag.

Boris
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Frage zu while (cin)

Beitrag von franzf »

Bist du dir sicher, dass das Code vom Stroustrup ist?
Das while(cin) macht schon Sinn. Es kommt hierher:
http://www.cplusplus.com/reference/iost ... or_voidpt/
Wenn cin keine gesetzten Fehlerbits enthält, gibt operator void* einen Zeiger ungleich dem Nullzeiger zurück. Das wird im while(cin) zu einem true. Wenn du also nie irgendwie einen Fehlerbit in deinem cin gesetzt bekommst, wird die Schleife auch nie enden.

Mich würde jetzt mal der originalcode von Stroustrup interessieren.
Boris_partys
Beiträge: 14
Registriert: 20. Februar 2012 06:22

Re: Frage zu while (cin)

Beitrag von Boris_partys »

Hallo franzf

Vielen Dank erst einmal für die Antwort.
Der zuvor von mir eingestellte Code war etwas auf meine offenen Fragen hin verändert, um mir etwas
mehr die Funktionsweise anzuschauen. Nichtsdesto trotz, bleibt das Programm in der Schleife hängen

Hier einmal der original komplette Code. Dieser kommt von seiner Homepage:

http://www.stroustrup.com/Programming/P ... g-code.zip
Kapitel 6.34

Ich freue mich auf Die Antwort auf while(cin). Danke franzf

Code: Alles auswählen

#include "std_lib_facilities.h"

//------------------------------------------------------------------------------

class Token {
public:
    char kind;        // welche Kategorie von Token
    double value;     // für Zahlen: ein Wert 
    Token(char ch)    // erstelle ein Token aus einem char
        :kind(ch), value(0) { }    
    Token(char ch, double val)     // erstelle ein Token aus einem char und einem double
        :kind(ch), value(val) { }
};

//------------------------------------------------------------------------------

Token get_token();    // liest ein Token aus cin

//------------------------------------------------------------------------------

vector<Token> tok;    // hier legen wir die Token ab 

//------------------------------------------------------------------------------

int main()
{
    while (cin) {
        Token t = get_token();
        tok.push_back(t);
    }
    // ...
    //Jetzt können wir mittels einer einfachen Schleife nach der Multiplikatin suchen:

    for (int i = 0; i<tok.size(); ++i) {
       if (tok[i].kind=='*') {          // wir haben eine Multiplikation gefunden!
          double d = tok[i-1].value*tok[i+1].value;
          // und nun?
       }
    }
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Frage zu while (cin)

Beitrag von franzf »

So wie ich das sehe, ist das Code in einer Zwischenstufe. Stroustrup wird sicher auf die Probleme eingehen. Speziell sagt der Dateiname zur 6.3.4 "no-link" - das wird nicht linken, da eine get_token-Implementierung fehlt.
Ich hatte mir aus 6.6 das get_token geholt, und ja, das bleibt ewig in der loop, da es kein ordentliches Abbruchkriterium gibt. Einen char mit cin lesen wird eigentlich immer gehen.
Ich schlage vor, lies das Buch weiter (so was ich gehört habe ist es gut), dann wirst du sicher auf eine Lösung geführt :)
Boris_partys
Beiträge: 14
Registriert: 20. Februar 2012 06:22

Re: Frage zu while (cin)

Beitrag von Boris_partys »

Vielen Dank erst einmal. Dann hat sich meine Vermutung grob bestätigt.
Ich hoffe, mich trotzdem bei Fragen hier etwas tummeln zu dürfen :D
Antworten