(C++) Eigentlich recht simples Programm crasht (gelöst!?)

Cai-pirinha

Enthusiast
Thread Starter
Mitglied seit
20.04.2006
Beiträge
3.681
Ort
Augsburg
Heydiho,
also, da mein T-Balancer nun wieder funktioniert und ich keine Funktion gefunden habe, die mir ein stetiges Protokollieren der Temperaturen ermöglicht, habe ich kurzerhand beschlossen, mich selbst an ein solches Programm zu wagen. Der Balancer speichert bei mir die Daten in eine Textdatei, die wie folgt aussieht:
Raum
27,0
Case
28,5
HDD
30,0
VGA
43,0
alle 3 Sekunden wird sie mit neuen Werten überschrieben - da liegt der Hund begraben ;)
Eigentlich nicht so wild, dachte ich: Datei(en) einlesen, die erste Zeile ist Name, die zweite Temp, dritte Zeile Name etc. etc., die Daten sortieren und das ganze in ner schönen Tabelle wieder abspeichern - irgendwie war es dann aber doch komplizierter als gedacht und hat sich über die Nacht hingezogen, das dürfte wohl an meinen eher mageren und sehr eingerosteten C++ Kentnissen liegen :fresse: Und wahrscheinlich bekommt manch einer beim Ansehen des Quelltexts einen mittleren Kotzanfall :fresse: Leider konnte ich mir außerdem nie angewöhnen, Kommentare in den Code zu schreiben. Aber ich denke, es sollte auch so alles klar sein.
Jedenfalls funktioniert das Programm inzwischen einwandfrei, wenn da nicht diese Crashes wären.. mal kommt nach 12 "Datensätzen" die Meldung, dass das Programm einen Fehler verursacht hat und beendet werden muss. Mal schon nach 5 und mal erst nach über 40.. und ich weiß beim besten Willen nicht woran es liegen könnte. Stimmt was beim Filehandling nicht?
Ich hoffe jemand kann mir helfen ;)
Danke schonmal! :wink:


Achja, als Datentypen für die Temperaturen im struct habe ich übrigens String deswegen gewählt, da es für mich 1. zum Schluss leichter zum Weiterverarbeiten ist und 2. wegen des Kommas drin ;) Müsste dann jeden eingelesen Wert zerpflücken usw.. Dachte mir daher, dass String besser wäre.

[edit2] Habe nun zuerst den Befehl zum HTML-Datei-Schreiben ausgelagert, sodass das erst nach dem Tastendruck erfolgt. Bei etwa 30 Datensätzen ist der Knackpunkt zum Crash. Daher habe ich nun den string "html" weggelassen, sodass jeder Teil einzeln reingeschrieben wird - dass also der String nicht zu lang werden kann. Damit läuft er wieder automatisch durch, bei Satz 95 ist das Programm jetzt abgestürzt.
[edit3] Das wars wohl doch nicht, jetzt wieder Crash bei 38..
[edit4] Crash bei >180.. sehr komisch.
[edit5] Scheine die Lösung nun zu haben :fresse: Hatte die Vermutung, dass es Probleme gibt, wenn T-Ban und mein Logger gleichzeitig auf die Dateien zugreifen. Nun lasse ich vom Logger vor dem Auslesen erst einmal die Dateien kopieren um sie für sich alleine zu haben - bisher stürzte das Programm bei fast 2000 Durchläufen nicht ab :bigok:

Logger.cpp:
Code:
#include <fstream>
#include <sstream>
#include <iostream>
#include <vector>
#include <windows.h>
#include <conio.h>

using namespace std;


struct sensor
{
	string descr;
	vector<string> temp;
	string maxtemp;
	string mintemp;
};

class Logger
{
public:
		Logger(vector<string> input,vector<int> sPF);
		void writeHTML(string outputFile);
		void readFirstValues();
		void readAddValues();
private:
    vector<string> inputFiles;
		vector<int> sensorsPerFile;
		vector<sensor> sensors;
};

Logger::Logger(vector<string> input,vector<int> sPF)
{
	sensorsPerFile=sPF;
	inputFiles=input;
};

void Logger::readFirstValues()
{
	char tmp[100];
	sensor tmpSens;
	tmpSens.maxtemp="0";
	
	for(int i=0;i<inputFiles.size();i++)
	{
		string pfad=inputFiles[i]+"_";
		CopyFile(inputFiles[i].c_str(),pfad.c_str(),0);
	  ifstream stream(pfad.c_str());
		int j=0;
		while(j<(sensorsPerFile[i]*2))
		{
			stream.getline(tmp,100);
			
			if(tmp[0]!='\0')
			{
				if((j+2)%2==0)
				{
					tmpSens.descr=tmp;
				}
				else
				{
					tmpSens.maxtemp=tmp;
					tmpSens.mintemp=tmp;
					tmpSens.temp.push_back(tmp);
				}
			}
			if((j+2)%2!=0)
			{
				sensors.push_back(tmpSens);
				tmpSens.temp.clear();
			}
			j++;
		}
		stream.close();
	}
};

void Logger::readAddValues()
{
	char tmp[100];
	sensor tmpSens;
	
	for(int i=0;i<inputFiles.size();i++)
	{
	  string pfad=inputFiles[i]+"_";
		CopyFile(inputFiles[i].c_str(),pfad.c_str(),0);
	  ifstream stream(pfad.c_str());
		int j=0;
		while(j<(sensorsPerFile[i]*2))
		{
			stream.getline(tmp,100);
			
			if(tmp[0]!='\0')
			{
				if((j+2)%2==0)
				{
					tmpSens.descr=tmp;
				}
				else
				{
					for(int k=0;k<sensors.size();k++)
					{
						if(sensors[k].descr==tmpSens.descr)
						{
							stringstream str1,str2,str3;
							float temp,maxtemp,mintemp;
							str1<<tmp;
							str1>>temp;
							if(tmp[2]==','&&tmp[3]=='5') temp+=0.5;
							str2<<sensors[k].maxtemp;
							str2>>maxtemp;
							if(sensors[k].maxtemp[2]==','&&sensors[k].maxtemp[3]=='5') maxtemp+=0.5;
							str3<<sensors[k].mintemp;
							str3>>mintemp;
							if(sensors[k].mintemp[2]==','&&sensors[k].mintemp[3]=='5') mintemp+=0.5;
							if(temp>maxtemp)
								sensors[k].maxtemp=tmp;
							if(temp<mintemp)
							  sensors[k].mintemp=tmp;
							sensors[k].temp.push_back(tmp);
						}
					}
				}
			}
			j++;
		}
		stream.close();
	}
};

void Logger::writeHTML(string outputFile)
{
	ofstream out(outputFile.c_str());
	string html_start="<html><head><title>T-Ban Log</title><style type=\"text/css\">table {font:10pt Verdana;border:2px solid black; } td,th { text-align:center;width:40px;border:1px solid black }</style></head><body>";
	string html_end="</body></html>";
	string html_table_start="<table>";
	string html_table_end="</table>";
	string html_table_values;
	vector<string> values;
	
	string html_table_descr="<tr><td></td>";
	for(int i=0;i<sensors.size();i++)
	{
		html_table_descr+="<th>"+sensors[i].descr+"</th>";
	}
	html_table_descr+="</tr>";
	
	string html_table_maxtemps="<tr><th>max.</th>";
	for(int i=0;i<sensors.size();i++)
	{
		html_table_maxtemps+="<td>"+sensors[i].maxtemp+"</td>";
	}
	html_table_maxtemps+="</tr>";
	
	string html_table_mintemps="<tr><th>min.</th>";
	for(int i=0;i<sensors.size();i++)
	{
		html_table_mintemps+="<td>"+sensors[i].mintemp+"</td>";
	}
	html_table_mintemps+="</tr>";
	
	for(int i=0;i<sensors[0].temp.size();i++)
	{
		stringstream str;
		string ibla;
		str<<((i+1)*5);
		str>>ibla;
		html_table_values+="<tr><th>"+ibla+"s</th>";
	  for(int j=0;j<sensors.size();j++)
		{
			html_table_values+="<td>"+sensors[j].temp[i]+"</td>";
		}
		html_table_values+="</tr>";
		values.push_back(html_table_values);
		html_table_values="";
	}

	out.write(html_start.c_str(),html_start.length());
	out.write(html_table_start.c_str(),html_table_start.length());
	out.write(html_table_descr.c_str(),html_table_descr.length());
	out.write(html_table_maxtemps.c_str(),html_table_maxtemps.length());
	out.write(html_table_mintemps.c_str(),html_table_mintemps.length());
	for(int i=0;i<values.size();i++)
	{
		out.write(values[i].c_str(),values[i].length());
	}
	out.write(html_table_end.c_str(),html_table_end.length());
	out.write(html_end.c_str(),html_end.length());
	out.close();
};

int main()
{
	vector<string> inputFiles;
	vector<int> sPF;
	
	inputFiles.push_back("C:\\Programme\\mCubed\\T-Balancer\\Navigator 2.12\\export\\sens_bigng.txt");
	inputFiles.push_back("C:\\Programme\\mCubed\\T-Balancer\\Navigator 2.12\\export\\sens_digital.txt");
	sPF.push_back(4);
	sPF.push_back(2);
	string outputFile="C:\\Programme\\mCubed\\T-Balancer\\Navigator 2.12\\export\\log.html";
	
	Logger logfile(inputFiles,sPF);
	logfile.readFirstValues();
	
	cout<<"Durch Druecken einer Taste wird das Programm beendet."<<endl;
	cout<<"1 Datensatz"<<endl;
	int i=0,datensaetze=1;
	while(!kbhit())
	{
  	Sleep(500);
		if(i==10)
		{
			i=0;
			logfile.readAddValues();
			datensaetze++;
			cout<<datensaetze<<" Datensaetze"<<endl;
			logfile.writeHTML(outputFile);
		}
		i++;
	}
	
  return 0;
}
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
... Hatte die Vermutung, dass es Probleme gibt, wenn T-Ban und mein Logger gleichzeitig auf die Dateien zugreifen. ...

Richtige Vermutung. Mann sollte beim Öffnen von Dateien immer prüfen, ob das auch ging ! Ggf. dann nach Wartezeit nochmal probieren, dann funktionierts auch ohne die Kopiererei.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh