Matrix aus einer Datei einlesen
-
Hallo,
ich möchte eine Matrix aus einer Datei einlesen. Sie sieht ungefähr so aus:
12.3 37.6 51.6 100.0 9.6 ...
29.8 52.3 0.9 ...
...Insgesamt hat die Matrix die Form [31][24].
Sie steht in einer Datei, die keine Endung hat (denke, dies ist aber egal).
Ich möchte den Mittelwert der Spalten bekommen und in einem Memo-Feld ausgeben.
Ich versuchte bisher, die Datei einzulesen und zur Kontrolle in Memo2 anzuzeigen. Dann die einzelnen Zeilen zusammenzuzählen und zu mitteln. Hier meine versuche:void __fastcall TForm1::Button1Click(TObject *Sender) { char b[744]; double c[100]; Memo1->Lines->Clear(); Memo2->Lines->Clear(); if (OpenDialog1->Execute()) { FILE* Oeffnen; Oeffnen = fopen((OpenDialog1->FileName).c_str(),"r"); char s[100]; while (!feof(Oeffnen)) { strcpy(s,""); fscanf(Oeffnen,"%s",s); if (strlen(s)!=0) { Memo2->Lines->Add(s); } } fclose(Oeffnen); for (int i=1; i<=744; i++) //Versuch 1 { c[i]=0.0; for (int j=0; j<=23; j++) { b[i] = Memo2->Lines->Strings[i].ToDouble(); //b[i] = b[i] + (Memo2->Lines->Value[i]); c[i]=b[i+31*j]; } c[i] += c[i]/31; Memo1->Lines->Add(c[i]); } } } /* Versuch 2 if(OpenDialog1->Execute()) Memo1->Lines->LoadFromFile(OpenDialog1->FileName); for (int i=1; i<=31; i++) { b[i]=0.0; for (int j=1; j<=24; j++) b[i] = b[i] + (Memo1->Lines->Strings[i+31*j].c_str()).ToDouble(); //b[i] = b[i] + Memo1->Lines->Text[i].ToDouble(); b[i] = b[i]/31; Memo2->Lines->Add(b[i]); } */ } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { DecimalSeparator = '.'; }
Danke für die Hilfe. Ich weiß wirklich nicht mehr weiter.
Edit:
Bitte die Code-Tags benutzen. Danke!
-
Hi,
versuch mal (laut deinem versuch 2)Memo1->Lines->LoadFromFile(OpenDialog1->FileName); TStringList* zahlen = new TStringList(); float spaltenWert[24]; for (int t = 0; t < Memo1->Lines->Count; t++) { zahlen->CommaText = StringReplace(Memo1->Lines->Strings[t], " ", ",", TReplaceFlags() << rfReplaceAll); for (int k = 0; k < zahlen->Count; k++) { spaltenWert[k] += StrToFloat(zahlen->Strings[k]); } } for (int s = 0; s < zahlen->Count; s++) { Memo2->Lines->Add(FloatToStr(spaltenWert[s]/31)); } delete zahlen;
müsst klappen ...
-
Danke schon mal.
Nur mein Builder kennt nicht die "StringReplace"-Funktion.
Was kann ich denn da machen?
-
Eine eigene schreiben? Simpelst-Variante:
String string_replace(String Source, String OldPattern, String NewPattern) { int p_length = OldPattern.Length(); for (int i = 1; i < Source.Length(); i++) { if (Source.SubString(i, p_length) == OldPattern) { Source.Delete(i, p_length); Source.Insert(NewPattern, i); } } return Source; }