Danke für Eure Antworten!
Allerdings habe ich wohl mein Problem nicht ganz präzise zum Ausdruck gebracht
Nach meinen Vorstellungen soll meine Datei (bisher Textdatei, obwohl die Idee mit der Binärdatei natürlich auch sehr sinnvoll klingt) etwa so aussehen:
s:1
deltax:9
deltay:12
rstart[d]:0.2
rstop[d]:0.8
Hierbei soll beispielsweise deltax der Variablenname sein, die Buchstaben die Dateitypen (hier bool, int und double) und alles nach dem ":" der Wert.
Das ich Variablen einführe, die dann so heißen wie in der Datei ist wahrscheinlich eine Illusion, aber ich hatte mir folgendes Konstrukt vorgestellt:
struct params
{
int length;
double* param;
};
Wie man am Code sieht, ist das derzeit auf Zahlen vom Typ double beschränkt.
Dafür habe ich bereits eine Routine geschrieben, die Strings in Double kovertiert.
Wen's interessiert: (ziemlich umständlich, aber scheint bisher zu funktionieren)
bool CSuperFilter::readParams(char* fileName, params* paramName, int expectedParams)
{
FILE* logFile;
logFile = fopen("logFile.txt", "w+");
fprintf(logFile, "Log Start\n");
char zeile[50];
int zeilen = 0;
char zeichen;
FILE* file = fopen(fileName, "r");
rewind(file);
while(fgets(zeile, 50, file) != NULL)
zeilen++;
fprintf(logFile, "Zeilen: %d\n", zeilen);
paramName->length = zeilen;
paramName->param = new double[paramName->length];
rewind(file);
int afterPoint = 0;
bool negativ = false;
int paramNumber = 0;
double value = 0;
int tempValue;
do
{
if((zeichen == '\n')||(zeichen == EOF)){
//Zeile vollständig gelesen
if(negativ) value *= -1;
paramName->param[paramNumber] = value;
fprintf(logFile, "Zeile %d: %f\n", paramNumber, value);
paramNumber++;
value = 0;
afterPoint = 0;
negativ = false;
}
else
{
if(zeichen == '.')
afterPoint = 1;
else
{
tempValue = Char2Byte(zeichen);
if(tempValue == 10)
negativ = true;
else
{
if(afterPoint == 0)
{
value *= 10;
value += tempValue;
}
else
{
value += tempValue/(pow(10,afterPoint));
afterPoint++;
}
}
}
}
}
while(((zeichen = fgetc(file)) != EOF));
fclose(file);
fprintf(logFile, "Log Ende\n");
fclose(logFile);
if(paramName->length != expectedParams) return false;
return true;
}
byte CSuperFilter::Char2Byte(char c)
{
byte temp = 0;
switch(c) {
case '0': temp = 0;break;
case '1': temp = 1;break;
case '2': temp = 2;break;
case '3': temp = 3;break;
case '4': temp = 4;break;
case '5': temp = 5;break;
case '6': temp = 6;break;
case '7': temp = 7;break;
case '8': temp = 8;break;
case '9': temp = 9;break;
case '-': temp = 10;break;
default: temp = 0;
}
return temp;
}
Da gibt es noch den Fehler, dass die letze Zeile in der Datei mit \n abschließen muss, aber das nur am Rande...
Diese Variante liest aber nur pure Zahlen auf Zeilen verteilt und eben nur double, ich würde aber gern verschiedene Varianten auslesen mit einem Konstrukt wie folgt (frei erfunden):
struct params
{
int length;
UniversalTyp* param;
};
Damit könnte ich dann theoretisch im Programm sagen etwas in der Art machen:
params para;
para->length = bla;
para->param[0] = 12345;
para->param[1] = "Hallo";
.
.
int bla = (int)para->param[0];
String blup = (String)para->param[1];
So ungefähr hatte ich mir das vorgestellt und suche eben diesen universalen Typ, der später verschiedene Typen sein kann. Das geht wie gesagt in
Java mit Object, aber in C++ kenn ich das Ganze leider nicht.
Danke für's Lesen dieses ganzen Zeugs
Edit: Hab noch den Code formatiert zum besseren Lesen.