problem beim schreiben in datei



  • hat sich nicht viel getan

    im moment habe ich ein anderes problem,

    wenn ich das programm ausführe funktionert beim ersten namen und der ersten zeit alles wuderbar.

    aber wenn ich dann bei meiner auswahl 1 auswähle
    wird der name übersprungen und ich kann nur noch die zeit eingeben

    ich denke wie das programm funktionieren soll, ist klar, vielleicht kann mir wer helfen oder das ganze abändern sodass es funktionert.

    brauche das für die schule 😉

    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    #include <fstream>
    #include <string> 
    
    int schalter;      
    const float a=981;
    float s;
    float t;
    string name;
    
    void berechnen(void);
    
    void main(void)
    {
    
      cout << __DATE__"  " __TIME__ "\n\n" ;
      cout << "Programm zur Berechnung der Reaktionzeit \n\n\n\n" ;
    
      berechnen( );          //hier wird die funktion zu berechnung der reaktionszeit aufgerufen
    
     }
    
      void berechnen(void)               //funktion zu berechnung
    { 
    
      cout << "Name eingeben. \n" ; 
      getline(cin, name); 
    
      cout << "Strecke 'S' in cm eingeben. \n" ; 
      cin >>s; 
      cout << " \n" ; 
      cout <<  "S="<< s << "cm\n"  <<endl; 
      cout << "Reaktionszeit:"; 
    
      ofstream schreiben; 
      schreiben.open("Ergebnisse.txt",ios::app);                //hier wird das ergebniss in die datei geschrieben 
      schreiben << name <<"  " << sqrt((2*s)/a) << "s\n" <<endl; 
      schreiben.close(); 
      cout << sqrt((2*s)/a) << "s\n\n" <<endl; 
    
      cout << "[1] n\x84 \bchste Reaktionszeit berechnen.\n" ; 
      cout << "[0] Programm beenden \n" ; 
    
    /* die folgenden zeilen beinhalten die auswahl am ende des programms, 
      option 1 ermöglicht eine weitere eingabe, option 0 beendet das programm 
      wird eine andere zahl eingegeben fordert das programm auf 0 oder 1 zu verwenden*/ 
    
      cin>>schalter; 
       switch(schalter) 
       { 
       case 1: 
       berechnen( ); 
          break; 
       case 0: 
       exit; 
          break; 
       default: 
       cout << "Bitte '0' oder '1' eingeben.\n\n" ; 
          break; 
      }; 
    
    }
    


  • also ich hab jetzt nochmal n tag rumprobiert und es immer noch nicht hingekriegt

    wie gesagt, ab dem zweiten aufrufen der berechnen funktion klappts nicht mehr



  • Erstmal reicht in deiner Funktion auch eine einfache Schleife statt der Rekursion. Und zweitens solltest du eventuell nach der Ja/Nein-Abfrage den Lesepuffer leerräumen.



  • zEt0 schrieb:

    wie gesagt, ab dem zweiten aufrufen der berechnen funktion klappts nicht mehr

    Das is doch genau das was ich mit dem std::cin.sync() meinte..



  • weiss ich ja, aber damit funktionierte es auch nicht



  • Bei mir funktionierts im MinGW.



  • ich hab auch MinGW

    und da ging es nicht...
    ab dem 2. mal kann ich nur noch die strecke eingeben



  • effe_eichelt schrieb:

    zEt0 schrieb:

    wie gesagt, ab dem zweiten aufrufen der berechnen funktion klappts nicht mehr

    Das is doch genau das was ich mit dem std::cin.sync() meinte..

    Der Standard garantiert nicht, das std::cin.sync() in diesem Zusammenhang korrekt funktioniert. Lest euch mal diesen Thread dazu durch.

    Gruß Caipi.



  • der thread hilft mir aber auch nicht weiter...

    mit dem cin.sync hab ich den selben fehler

    http://img411.imageshack.us/img411/9393/unbenannt9bl.jpg



  • zEt0 schrieb:

    der thread mir aber auch nicht weiter...

    mit dem cin.sync hab ich den selben fehler

    http://img469.imageshack.us/img469/8724/unbenannt0hp.jpg

    Dann hast du dir den Thread nicht komplett durchgelesen.

    Gruß Caipi



  • habe ich, aber anscheinend bin ich zu doof dazu.



  • vielen dank nochmal, es funktioniert jetzt



  • zEt0 schrieb:

    habe ich, aber anscheinend bin ich zu doof dazu.

    Also: sync() soll den istream-Puffer mit dem assoziierten Gerät synchronisieren. Das ist genau das was du willst, allerdings ist das Standard-Verhalten von std::istream::sync() dies, dass es std::streambuf::pubsync() aufruft, was wiederum std::streambuf::sync() aufruft (eine geschützte virtuelle Funktion), die 0 zurückgibt.
    Du fragst dich warum das so ist? Nun genau kann ich dir das nicht sagen, aber std::streambuf soll ja einen Buffer für ein beliebiges assoziiertes Gerät bereitstellen und es ist höchstwahrscheinlich, dass man Gerät X anders mit dem Buffer synchronisiert als Gerät Y. Deshalb das Standardverhalten: "0 zurückgeben".
    (Manche Implementationen weichen jedoch von diesem Standard-Verhalten ab, weshalb du wenn du z.B. den mingw verwendest std::istream::sync() aufrufen kannst und diese Funktion hier so implementiert wurde, dass sie tatsächlich den Buffer synchronisiert).

    Zu deinem Problem: Hast du dir schonmal die Methode std::istream::ignore() angeschaut?

    /edit: zu spät...

    Gruß Caipi



  • cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());

    damit hats geklappt 😉


Anmelden zum Antworten