problem beim schreiben in datei
-
also ich habe nen problem
bei meinem programm, wenn ich einen namen eingebe und eine zeit berechne funktioniert alles, aber wenn ich dann den nöchsten namen eingebe
geht das programm in eine endlosschleife und schreibt die datei voll bis man das programm schliesst.
wodran kanns liegen?#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; }; }
-
Für das Verhalten gibts verschiedene Dinge, zum einen passiert es wenn du für die Strecke ein Zeichen eingibst und keine Zahl (also bau ne Abfrage ein) und zweitens wird bei der zweiten Durchlauf die Namenseingabe nicht gemacht da im Tastaturbuffer noch was ist, ein std::cin.sync() vor der eingabe des Names (obwohl ich glaub das des unsauber war) löst dieses Problem.
-
das mit dem zeichen bei der strecke weiss ich...
ähm kann man den tastaturbuffer nicht auch einmal am anfang der funktion löschen oder so?
-
Die Eingabe in der Funktion sorgen dafür das was im Buffer ist, also würde das nich viel nützen, aber kannst ja mal versuchen, 100% bin ich mir dabei grad net sicher. ^^
-
hm irgendwie funktioniert das nich so ganz...
kannst du mal deinen code in meine zeilen einsetzen?
irgendwie setz ich das bei mir falsch ein...
-
void berechnen(void) //funktion zu berechnung { cin.sync() // das is alles, das syncronisiert den Buffer vor der Namensabfrage // kann aber auch im ersten case gemacht werden 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; }; }
-
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 eingebenich 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
-
zEt0 schrieb:
der thread mir aber auch nicht weiter...
mit dem cin.sync hab ich den selben fehler
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
