C++ Temperatur einlesen

AirForce

Lt. Junior Grade
Registriert
Okt. 2010
Beiträge
296
Schreibe ein Programm das aus einer Txt Datei Temperaturwerte einlesen soll. Die Werte werden durch Stunde und Temperaturwert paaren gesetzt. Doch bevor es in den Vektor kommt muss man es vorher von Celsius in Fahrenheit umrechnen. Und habe eine Prüfung geschrieben die Werte von über 40 Grad nicht annehmen soll. Und da das Probleme, es wird ausgeben das es ein falscher wert ist aber es werden die Daten eingelesen obwohl ich es so will das das Programm bei falschen werten die Eingabe abbricht.
Code:
void temp_stats()
{
	cout << "Geben Sie bitte den Namen der Eingabedatei ein:";
	string name;
	cin>>name;
	ifstream istr(name.c_str());
	if(!istr) cerr << "Fehler beim Oeffnen der Eingabedatei" << name << endl;
	vector <int> temps;
	int a;
	double b;
	char c;

	while(istr)
	{
		if(istr>>a>>c>>b)
			if(b < 0 || b > 40){
				cout << "Falscher Wert!" << endl; break;}
			else {
			b = b * 1,8 + 32;                 // Celsius in Fahrenheit umrechner
			temps.push_back(b);}
	}
	istr.close();
	
	double sum = 0;
	for(int i = 0; i < temps.size(); ++i)sum += temps[i];                // Mittelwert der Temperaturen berechnen
	cout << "Mittlerer Temperaturwert: " << sum/temps.size() << endl;

	sort(temps.begin(),temps.end());                                     // Zentralwert der Temperauren berechnen
	cout << "Zentraler Temperaturwert: " << temps[temps.size()/2.0] << endl;
}

int main()
{
    temp_stats();
	
	keep_window_open();
    return 0;
}
Und die Werte die in der Txt sind:
Code:
0\2
11\23
19\43
Also zuerst kommt Stunden dann als Trennzeichen \ und dann die Temperatur.
 
43 ist ja auch ein "Falscher Wert".
 
Ja das schon aber wieso bricht das Programm die einlese nicht ab, das ist mein Problem es soll bei falschen werten die einlese abbrechen.
 
Also mit break; springst du aus der Schleife raus und du arbeitest ab den Befehl istr.close(); wieder weiter- d.h. die Werte, welche bereits ausgelesen wurden werden verarbeitet. Willst du komplett rausspringen würde ich dir vorschlagen:
1. Rückgabeparameter bool zu verwenden (Fehler in main abfangen)
2. anstatt break; einfach istr.close(); return false;
3. Am Ende von temp_stats() return true;
 
Bitte gerne.
 
sinniger wäre aber continue; also den aktuellen schleifen durchlauf abbrechen. dann wird nur der falsche wert ausgelassen, denn danach können ja durchaus noch richtige werte folgen.
und allgemein sind schleifen sprünge mit break, meiner meinung nach, recht unschön, lieber eine bool variable machen die im schleifen kopf geprüft wird und im fehlerfall auf false setzen. Dann natürlich bei einem Fehler eine fehlerbehandlung machen, z.b. die daten nicht zu speichern und in ein Array den Fehler merken. So hast du eine bessere Kontrolle über die schleife und gleich ein protokoll was schief gelaufen ist.
 
Zurück
Oben