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;
    }
    

Anmelden zum Antworten