Problem mit cin



  • Nachdem in main() die Funktion Berechnung() aufgerufen und beendet wurde, wird Auswahl auf den Wert '2' abgefragt. Da diese Abfrage false ergibt (Du hast ja '1' eingegeben), wird der else-Zweig der if-Abfrage ausgeführt. Dort wird 'Falsche Eingabe' ausgegeben.





  • So, also das eine Problem habe ich jetzt so gelöst:

    if (Auswahl!=1 && Auswahl !=2 && Auswahl!=3)
                      cout << "Falsche Eingabe!" << endl;
    

    Aber beim anderen weiß ich immer noch nicht wirklich was ich jetzt schreiben soll.
    Wenn ich das ganze so schreibe: (wie im Link)

    char PN1 [256]; 
    
                     cout << "Name eingeben!" << endl;
    
                     cin.getline(PN1, 256);
    

    Tritt der selbe Fehler auf wie im ersten Post beschrieben.



  • Name lesen:

    char PN[100];
        cin.clear();  // Zeichen von cin oben aus dem Eingabepuffer entfernen
        cin.ignore(cin.rdbuf()->in_avail()); // auch zum entfernen
        cout << "Name eingeben!" << endl;
        cin.getline(PN,100); // sollte für Name reichen
    

    MfG f.-th.



  • Deine erste Variante
    von getline wirft die Suche zwar nicht heraus war aber doch okay, sorry 😡

    Deshalb hier noch etwas:

    int main()
    {
        int Auswahl;
    
        cout << "(1)Starten" << endl;
        cout << "(2)Beenden" << endl;
    
        cin >> (Auswahl);
        switch(Auswahl)
        {
        case 1:
            Berechnung ();
            break;
    
        case 2:
            cout << "Beenden..." << endl;
            break;
    
        default:
            cout << "Falsche Eingabe!" << endl;
    
        }
    
        return 0;
    }  // main zu
    


  • Gast191 schrieb:

    So, also das eine Problem habe ich jetzt so gelöst:

    if (Auswahl!=1 && Auswahl !=2 && Auswahl!=3)
                      cout << "Falsche Eingabe!" << endl;
    

    Ja, so geht das. Aber so geht es übersichtlicher:

    switch(Auswahl)
    {
       case 1:
          Berechnen();
          break;
    
       case 2:
          cout << "Beenden ...\n";
          break;
    
       default:
          cout << "Falsche Eingabe ...\n";
    }
    


  • Okay cool, danke, aber wenn ich deinen Codeblock gegen meinen austausche sieht das ganze so aus:

    ofstream Ausgabe;  
    
                     Ausgabe.open(dateiname.c_str(), ios_base::out | ios_base::app); 
    
                     cout << "Name eingeben!" << endl;
    
                     char PN[100]; 
                     cin.clear();  // Zeichen von cin oben aus dem Eingabepuffer entfernen 
                     cin.ignore(cin.rdbuf()->in_avail()); // auch zum entfernen 
                     cout << "Name eingeben!" << endl; 
                     cin.getline(PN,100); // sollte für Name reichen
    
                     Ausgabe << PN << ": " << Punkte << " P" << endl; 
    
                     Ausgabe.close();
    

    Allerdings erscheint immer noch das selbe Symptom wie im ersten Post, der Name kann nicht eingegeben werden und es wird auch kein Name in der Datei gespeichert.

    Folgendes funktioniert aber:

    ofstream Ausgabe;  
    
                     Ausgabe.open(dateiname.c_str(), ios_base::out | ios_base::app);
    
                     char PN [100]; 
                     cout << "Name eingeben!" << endl; 
                     cin.get();
                     cin.getline(PN, 100); 
    
                     Ausgabe << PN << ": " << Punkte << " P" << endl; 
    
                     Ausgabe.close();
    

    scheint also am cin.clear() bzw. am cin.ignore() zu liegen, aber warum geht dann cin.get()?

    Falls du es dir mal compilieren willst, hier der komplette Code (der, der nicht richtig funktioniert):

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    int Berechnung (); //Berechnung und schreiben in die Datei
    int Lesen (); //Highscore lesen
    string dateiname ="HGStest.test";
    
    int main()
    {
    
                   int Auswahl;
                   cout << "(1)Starten" << endl; 
                   cout << "(2)Highscore einsehen" << endl;
                   cout << "(3)Beenden" << endl; 
    
                   cin >>(Auswahl);
    
                   if (Auswahl==1) 
                      Berechnung (); 
    
                   if (Auswahl==2)
                      Lesen ();
    
                   if (Auswahl==3) 
                      cout << "Beenden..." << endl;
    
                  if (Auswahl!=1 && Auswahl !=2 && Auswahl!=3)
                      cout << "Falsche Eingabe!" << endl; 
    
        return 0;                    
    }  // main zu   
    
    //////////////////////////    
    int Berechnung ()              //Berechnung und schreiben in die Datei     
    {    
                     double var=0;
                     double neueZeit=0, alteZeit=0;  
                     double CPUTICKS;
                     double Rechnung=0;
    
                     cout << "Es wird gerechnet..." << endl;
    
                     alteZeit=clock(); ////////////////////////////////////////////////////////////////
                     //////////////////////////////////////////////////////////////////////////////////
    
                     do
                     {
                                       var++; 
                                       Rechnung = (27.53433*(var/(var*0.01))/6.5+(2*(64*64)))/400.504;
    
                     } while (var!=900000000);
    
                     neueZeit=clock(); //////////////////////////////////////////////////////////////////
                     ////////////////////////////////////////////////////////////////////////////////////
    
                     CPUTICKS = neueZeit - alteZeit; 
                     double Punkte = (Rechnung/CPUTICKS) *20000.5;
    
                     cout << endl;
                     cout << "Fertig!" << endl; 
                     cout << "Punkte: " << Punkte << endl;   
    
                     ofstream Ausgabe;  
    
                     Ausgabe.open(dateiname.c_str(), ios_base::out | ios_base::app);
    
                     char PN [100]; 
                     cout << "Name eingeben!" << endl; 
                     cin.get();
                     cin.getline(PN, 100); 
    
                     Ausgabe << PN << ": " << Punkte << " P" << endl; 
    
                     Ausgabe.close(); 
    
                     return 0; 
    }
    ///////////////////////////
    
    int Lesen ()
    {
         ifstream HGLesen;
         HGLesen.open (dateiname.c_str(), ios_base::in); 
    
         char Zeichen; 
    
         while(!HGLesen.eof())
         {
                HGLesen.get(Zeichen);
                cout << Zeichen;  
         }
    
                cin.clear(); 
                int Auswahl2; 
                cout << "(1) Zurueck ins Menu" << endl; 
                cout << "(2) Beenden" << endl; 
                cin >> Auswahl2;
    
                if (Auswahl2==1) 
                   main (); 
    
                if (Auswahl2==2)
                   cout << "Beenden..." << endl;
    
        HGLesen.close(); 
    
        return 0; 
    }
    


  • Zu deinem Quelltext
    Gibt denn dein Compiler keine Fehlermeldung oder Warnung aus 😕

    Der gcc und der DM will noch folgenden header:

    #include <ctime>
    

    und da eine Warnung vom gcc zu Zeile 108:

    if (Auswahl2==1)
                   main (); // dieses Ziel ist keine gute Idee
    

    Warum überarbeitest du nicht die
    int main
    so wie belli oder ich geschrieben haben und packst um die switch-case-Geschichte noch eine schöne
    do-while
    dann brauchst du nicht zu main zurück wie du in Zeile 109 es willst.

    MfG f.-th.



  • Ich benutze Dev C++ und bei mir hat er nirgends gemeckert.
    Werde euren Ratschlag befolgen und das ganze mit switch und do-while machen. Das mit dem main() hatte ich mir schon gedacht, aber da keine Warnung kam, war ich mir nicht mehr sicher und habs einfach probiert.

    Dann hätte ich noch eine Frage:

    Ich habe eine Datei, die ganz sicher nur Zahlen beinhaltet, in diesem Fall nur die Punktzahl speichert. Jetzt will ich, dass die gespeicherte Zahl ausgelesen wird und in einer Variable gespeichert wird, damit ich damit weiterrechnen kann.

    ifstream Lesen; 
                     PLesen.open (dateiname2.c_str(), ios_base::in);
    
                     char Highscore; 
    
                     while(!Lesen.eof())
                     {
                                           Lesen.get(Highscore); 
    
                     } 
                     Lesen.close (); 
    
                     double Highscore3 = Highscore //Hier weiß ich jetzt nicht, wie ich die gesamte Zahl da rein bekomme, denn oben wird ja pro "Runde" nur ein Zeichen eingelesen, ich will aber die ganze Zahl haben.
    


  • sorry, es muss natürlich so heißen:

    [cpp]

    string dateiname2 ="HGSZ.txt";
    ifstream Lesen;
    Lesen.open (dateiname2.c_str(), ios_base::in);

    char Highscore;

    while(!Lesen.eof())
    {
    Lesen.get(Highscore);

    }
    Lesen.close ();

    double Highscore3 = Highscore //Hier weiß ich jetzt nicht, wie ich die gesamte Zahl da rein bekomme, denn oben wird ja pro "Runde" nur ein Zeichen eingelesen, ich will aber die ganze Zahl haben.

    [/cpp][/quote]



  • Wenn in Deiner Datei nur ein Integer mit dem Highscore steht, dann zB so:

    ifstream Lesen(dateiname2.c_str(), ios_base::in);
    
    int Highscore;
    
    Lesen >> Highscore;
    
    Lesen.close ();
    


  • Super, danke 🙂

    Mein kleines "Projekt" ist somit fertig.
    Hab den ganzen Code hier nochmal gepostet.
    Wenn ihr wollt teilt mir eure Punktzahl und den Namen + Takt eures Prozessors mit.
    Damit ich ungefähr weiß wie das Prog. skaliert.
    Auf einem Phenom II @ 3.7 GHz hab ich ca. 26.6 Punkte.

    Sry, dass der Post so lang dadurch wird.

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <windows.h>
    #include <ctime>
    
    using namespace std;
    
    int Berechnung (); //Berechnung Prüfen ob neuer HG
    int Lesen (); //Highscore lesen
    int Rating (); //CPU Bewerten
    
    string dateiname2 ="HGSZ.z"; // Datei für Pkt
    string dateiname  ="HGSN.n"; // Datei für Name
    
    int main()
    {                 ///////////////////////////////////////////////
                      ofstream DateiZ;  
                      ofstream DateiN; 
    
                     DateiN.open(dateiname.c_str(), ios_base::out);
                     DateiZ.open(dateiname2.c_str(), ios_base::out);
    
                     string Startname = "Max Mustermann";                           //// Datei am Anfang erstellen und Startwerte 
                     double Startpkt = 15.5;                                        //// einschreiben, damit beim Prüfen was da ist.
    
                     DateiZ << Startpkt << endl;
                     DateiN << Startname << endl;  
    
                     DateiZ.close(); 
                     DateiN.close(); 
                     /////////////////////////////////////////////////
    
                   int Auswahl;
    
                   do
                   {
    
                   cout << endl;
                   cout << "--------------------" << endl; 
                   cout << "(1)Starten" << endl; 
                   cout << "(2)Highscore einsehen" << endl;
                   cout << "(3)Beenden" << endl; 
    
                   cin >> Auswahl;
    
                   switch (Auswahl) 
                   {
                          case (1): 
                          {
                               Berechnung (); 
                          } break; 
    
                          case (2): 
                          {
                               Lesen (); 
                          } break;
    
                          case (3): 
                          {
                               cout << "Beenden..." << endl; 
                          } break; 
    
                   }
                  } while (Auswahl!=3);
        return 0;                    
    }     
    
    //////////////////////////    
    int Berechnung ()              //Berechnung und Prüfen ob neuer HG     
    {    
                     double var=0; // Variable zum Rechnen
                     double neueZeit=0, alteZeit=0;  // aus neu - alt entsteht die nötige CPUZeit
                     double CPUTICKS; // CPUZeit die für die Berechnung nötig ist
                     double Rechnung=0; // Ergebnis der Rechnung (für Pkt nötig)
    
                     cout << "Es wird gerechnet..." << endl;
    
                     alteZeit=clock(); ////////////////////////////////////////////////////////////////
                     //////////////////////////////////////////////////////////////////////////////////      Zeit messen start
    
                     do
                     {
                                       var++; 
                                       Rechnung = (27.53433*(var/(var*0.01))/6.5+(2*(64*64)))/400.504;
    
                     } while (var!=900000000);
    
                     neueZeit=clock(); //////////////////////////////////////////////////////////////////
                     ////////////////////////////////////////////////////////////////////////////////////    Zeit messen ende
    
                     CPUTICKS = neueZeit - alteZeit; 
                     double Punkte = (Rechnung/CPUTICKS) *20000.5; // Punkte berechnen
    
                     ////////////////////////////////////////////////////////////////////// neuer HG prüfen + überschreiben oder net
    
                     ifstream PLesen;  // HG lesen (zum prüfen ob höher)
                     PLesen.open (dateiname2.c_str(), ios_base::in);
    
                     double Highscore; 
    
                     PLesen >> Highscore;
    
                     PLesen.close();
    
                     if (Punkte>Highscore)
                     {
    
                                           ofstream Ausgabe;  // Namen schreiben
                                           ofstream Ausgabe2; // Punkte schreiben
    
                                           Ausgabe.open(dateiname.c_str(), ios_base::out);
                                           Ausgabe2.open(dateiname2.c_str(), ios_base::out);
    
                                           cout << endl;
                                           cout << "----------------" << endl;
                                           cout << "Neuer Highscore!" << endl; 
                                           cout << "Punkte: " << Punkte << endl;   
                                           Rating(); 
                                           cout << endl;
    
                                           string Name; // für neuen Namen eingeben
    
                                           cin.get(); // cin leeren
    
                                           cout << "Name eingeben!" << endl;
    
                                           getline(cin,Name);
    
                                           Ausgabe << Name << endl; 
                                           Ausgabe2 << Punkte << endl;  
    
                                           Ausgabe.close(); 
                                           Ausgabe2.close(); 
    
                     }
    
                    if (Punkte<Highscore)
                    {   
    
                       cout << endl; 
                       cout << "-----------------------------" << endl;
                       cout << "Leider kein neuer Highscore.." << endl; 
                       cout << "Punkte: " << Punkte << endl;
                       cout << "Highscore: " << Highscore << endl; 
    
                     } 
    
                     return 0; 
    }
    ///////////////////////////
    
    int Lesen () 
    {
         ifstream HGLesen; //Namen lesen
         HGLesen.open (dateiname.c_str(), ios_base::in); 
    
         ifstream HGPLesen; //Punkte lesen
         HGPLesen.open (dateiname2.c_str(), ios_base::in);
    
         char Name; // für Namen auslesen
         cout << "---------------------" << endl; 
         cout << "Aktueller Highscore: " << endl;
         cout << "---------------------" << endl; 
         cout << endl;
         cout << "Name: "; 
         while(!HGLesen.eof())
         {
                HGLesen.get(Name); 
                cout << Name; 
         }
                HGLesen.close();
    
         cout << endl;
         cout << "Punkte: "; 
    
         double Highscore; // für Zahl auslesen
    
         HGPLesen >> Highscore; 
    
         cout << Highscore;  
    
         HGPLesen.close (); 
    
         Rating(); 
    //////////////////////////////////////// 
    
        return 0; 
    } 
    
    int Rating () // Pkt bzw. CPU bewerten
    {
                     ifstream PLesen; 
                     PLesen.open (dateiname2.c_str(), ios_base::in);
    
                     double Highscore; 
    
                     PLesen >> Highscore;
    
                     PLesen.close();
    
                     if (Highscore<10)
                     {  
                        cout << endl;
                        cout << "Rating: Schlecht!" << endl;
                        cout << endl;
                     }
    
                     if (Highscore<15 && Highscore>10)
                     {
                        cout << endl; 
                        cout << "Rating: Mittelmäßig!" << endl; 
                        cout << endl; 
                     }
    
                     if (Highscore<20 && Highscore>15) 
                     {
                        cout << endl; 
                        cout << "Rating: Gut!" << endl; 
                        cout << endl; 
                     }
    
                     if (Highscore<25 && Highscore>20) 
                     {
                        cout << endl; 
                        cout << "Rating: Sehr gut!" << endl; 
                        cout << endl; 
                     }
    
                     if (Highscore<30 && Highscore>25)
                     {
                        cout << endl; 
                        cout << "Rating: Aussergewoehnlich gut!" << endl; 
                        cout << endl; 
                     }
    
                     if (Highscore>30) 
                     {
                        cout << endl; 
                        cout << "Rating: Fantastisch!" << endl; 
                        cout << endl; 
                     }
    
                     return 0; 
    }
    

Anmelden zum Antworten