Matrix einlesen



  • Ja, so habe ich mir das vorgestellt. Nur hat es bis jetzt leider noch nicht funktioniert.



  • Das ganze sind ziemlich viele Daten und je nach Datenfile variieren die Anzahl der Zeilen und Spalten.



  • Für eine Matrix, die lediglich int-Werte speichern soll:

    int main()
    {
          int matrix[10][10];
          int i,j;
          char vBuf[128];
    
          for(i=0;i<10;i++)
              for(j=0;j<10;j++)
              {
                   printf("Matrix an der Stelle [%d][%d]: ",i,j);
                   fgets(vBuf,128,stdin);
                   sscanf(vBuf,"%d",matrix[i][j]);
              }
    
          return 0;
    }
    

    Ansonsten wäre es villeicht hilfreich, wenn wir wüßten, um welche daten es sich handelt und wie Du dir das genau vorstellst.



  • Also, das ganze ist ein Datenfile mit unterschiedlichen Werten (integer, double). Das Problem ist, dass Dezimalwerte nicht mit Punkt sondern mit Komma geschrieben werden.
    Jedes File enthält 199 Spalten und eine varierende Anzahl an Zeilen.
    Ich möchte ein Programm schreiben, das jedes dieser Files einlesen kann und mit den eingelesenen Werten weiter rechnen kann.
    Ich hoffe ihr könnt mir weiterhelfen.

    Hier ein kurzer Auszug aus dem Datenfile:
    50 1 5555 113959444 0,850117366 0,156742206 505,572984 -0,04235439 -0,028996905

    Gruß



  • geh einfach die datei zeichen für zeichen durch und speichere die zeichen in einem buffer ab, wenn ein leerzeichen eingelesen wurde machst du atoi() etc. und leerst den buffer.



  • Das mit den Kommata ist ein Problem. An der Struktur des Datenfiles gibts nichts zu rütteln? Es wäre deutlich einfacher, wenn man die Kommata durch Punkte ersetzen könnte.



  • Richard schrieb:

    Für eine Matrix, die lediglich int-Werte speichern soll:

    int main()
    {
          int matrix[10][10];
          int i,j;
          char vBuf[128];
          
          for(i=0;i<10;i++)
              for(j=0;j<10;j++)
              {
                   printf("Matrix an der Stelle [%d][%d]: ",i,j);
                   fgets(vBuf,128,stdin);
                   sscanf(vBuf,"%d",matrix[i][j]);
              }
         
          return 0;
    }
    

    Ansonsten wäre es villeicht hilfreich, wenn wir wüßten, um welche daten es sich handelt und wie Du dir das genau vorstellst.

    Hier gibts ein Problem..... Speicheradressenfehler, wenn man das Programm zum zweiten mal in der Eingabe hat.



  • Das mit der Datenstruktur könnte ich ändern, also Punkte statt Komma.
    Aber wie deklariere eine Matrix, von der ich die Dimension nicht kenne? Wird aber wohl über 3000 Zeilen haben.
    Und woher weiß ich, wie weit meine Schleifen laufen müssen?



  • Wenn es nicht unbedingt reines ANSI-C sein muß: vector aus der STL

    //--------------------------------------------------------
    // Global matrix of data       y0 1,0  1,1  1,2 ...
    //                             y1 0,0  0,1  0,2 ...
    //                                x0   x1   x2  ...
    //--------------------------------------------------------
    vector<vector<int> > V(0, vector<int>(0));
    

    y0 ... sind die "Zeilen" und x0 ... die Spalten. Beliebig viele und in unterschiedlicher Länge (Anzahl an Werten/Spalten).


    Wird das Einlesen der Werte auch mit der STL gemacht, so gibt es in ifstream eine nützlich Funktion: .eatwhite()

    Statt int ist auch jeder andere Typ denkbar.

    Blackbird



  • Weisst Du die Größe absolut nicht?
    Sonst kannst Du in der Datei doch in der ersten Zeile die Dimension speichern, ala:

    2 3
    1 2 3 4 5 6
    

    Wenn Du die Dimension nicht kennst wirds schwer. Du kannst aber mit Sonderzeichen speichern, meinetwegen ein Leerzeichen für ein neues Element in einer Zeile, ein "/" wenn die Spalte zuende ist und ein "\" wenn die Datei zuende ist(o.ä.)

    Dann hättest Du:

    1 2 3/
    4 5 6\
    

    Dann kannst Du per Prüfung der Zeichen jede beliebige (aber auch jede fehlerhaft eingegebene) Matrix einlesen.

    Gruss M



  • Also - ich würde wahrscheinlich die Ausmaße der Matrix an den Anfang der Datei schreiben und entsprechend viel Speicher anfordern. Das sähe dann in etwa so aus:

    4 3
    1 0 3.141 5.2
    3.2 0.34 1 3
    4 5.25 6.234 6
    

    Und beim auslesen:

    file *fd = fopen("foo.dat", "r");
    int x, y, i, j;
    double **feld;
    
    fscanf(fd, "%d %d", &x, &y);
    feld = malloc(sizeof(double*) * x);
    for(i = 0; i < x; ++i)
      feld[i] = malloc(sizeof(double) * y);
    
    for(i = 0; i < x; ++i)
      for(j = 0; j < y; ++j)
        fscanf(fd, "%lg", &feld[i][j]);
    
    /* mit dem Feld arbeiten */
    
    for(i = 0; i < x; ++i)
      free(feld[i]);
    free(feld);
    


  • 😃 2 Sek früher! (Dafür hast Du auch Code...)



  • cHillb3rT schrieb:

    Richard schrieb:

    Für eine Matrix, die lediglich int-Werte speichern soll:

    int main()
    {
          int matrix[10][10];
          int i,j;
          char vBuf[128];
          
          for(i=0;i<10;i++)
              for(j=0;j<10;j++)
              {
                   printf("Matrix an der Stelle [%d][%d]: ",i,j);
                   fgets(vBuf,128,stdin);
                   sscanf(vBuf,"%d",matrix[i][j]);
              }
         
          return 0;
    }
    

    Ansonsten wäre es villeicht hilfreich, wenn wir wüßten, um welche daten es sich handelt und wie Du dir das genau vorstellst.

    Hier gibts ein Problem..... Speicheradressenfehler, wenn man das Programm zum zweiten mal in der Eingabe hat.

    Ich Dummerchen 🙄 , bei der sscanf-Anweisung fehlt natürlich das Adresssymbol vor dem Variablennmamen.

    int main()
    {
          int matrix[10][10];
          int i,j;
          char vBuf[128];
    
          for(i=0;i<10;i++)
              for(j=0;j<10;j++)
              {
                   printf("Matrix an der Stelle [%d][%d]: ",i,j);
                   fgets(vBuf,128,stdin);
                   sscanf(vBuf,"%d",&matrix[i][j]);
              }
    
          return 0;
    }
    

    Auf der anderen Seite hat man mir doch immer eingebleut, dass der Arrayname an sich schon ein Pointer ist. Warum geht das hier nicht 😕 ?



  • Weil du nicht das Array übergibst, sondern ein Element des Arrays.



  • man könnte auch entweder den speicher immer wieder mit realloc erweitern (ist aber recht unschön, da es dann zu häufig benutzt werden muss)
    oder man geht die datei zwei mal durch und schaut beim ersten durchlauf nach leerzeichen und zeilenvorschüben.


Anmelden zum Antworten