C++ Temperatur einlesen

AirForce

Lt. Junior Grade
Dabei seit
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.
 

RobaL

Lieutenant
Dabei seit
Apr. 2008
Beiträge
598
43 ist ja auch ein "Falscher Wert".
 

AirForce

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
296
Ja das schon aber wieso bricht das Programm die einlese nicht ab, das ist mein Problem es soll bei falschen werten die einlese abbrechen.
 

RobaL

Lieutenant
Dabei seit
Apr. 2008
Beiträge
598
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;
 

RobaL

Lieutenant
Dabei seit
Apr. 2008
Beiträge
598
Bitte gerne.
 

mercsen

Lt. Commander
Dabei seit
Apr. 2010
Beiträge
1.641
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.
 
Top