Matrix/ 2D-Array aus txt-Datei einlesen



  • Guuude Leutz!

    Ich weiß das diese Frage seeeehr oft in Foren auftritt und einige davon genervt sind. Aber leider habe ich keine passende Antwort für mein Problem finden können. So bitte ich Euch um bissle Geduld und Hilfe 😃

    So höret nun mein Problem.
    Hab ne Matrix in einer txt-Datei. Diese Matrix möchte ich gerne in einem 2D-Array einlesen. Problem ist jedoch, dass die Dimension bzw. die Anzahl der Zeilen und Spalten unbekannt sind.

    Mit ach und krach hab ich es hinbekommen das er mir die Anzahl der Matrix-Elemente einliest. Was mir jedoch sehr wenig nützt 😞 Spalten und Zeilen sind noch immer unbekannt 😕

    Vielen vielen Dank für jede kleinstmögliche Anmerkung, Anregung, Hilfe etc.

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    void main(void)
    {
    	double type;
    	int zaehler = 0;
    
    	ifstream InputFile ("double.txt");
    
    	if (!InputFile)
    	{
    		cerr << "Datei existiert nicht\n";
    		exit(-1);
    	}
    
    	while (!InputFile.eof ())
    	{
    		InputFile >> type;
    
    		if(type >= 0 || type <= 9)
    		{
    			zaehler++;
    		}
    	}
    	cout << zaehler << endl;
    }
    

  • Mod

    Beschreib mal genauer, wie die Datei aussieht. Außerdem: Muss es ein 2D Array sein oder darf es auch eine andere geeignete Datenstruktur sein?



  • Hier ein kleiner Auszug aus der txt-Datei:

    1            1             9           10            5
                2            5            10           11            6
                3            6            11           12            7
                4            7            12           13            8
                5            8            13           14            4
                6            9            15           16           10
                7            10           16           17           11
                8            11           17           18           12
                9            12           18           19           13
               10            13           19           20           14
               11            15           21           22           16
    

    Gehen wie davon aus das die Anzahl der Spalten und Zeilen unbekannt ist 😉



  • Sollte ein 2D-Array vom Typ double sein. Da ich mit dieser Matrix weitere mathematische Berechnungen durchführe.



  • schicko schrieb:

    Gehen wie davon aus das die Anzahl der Spalten und Zeilen unbekannt ist 😉

    Hola chico,
    die Anzahl muss bekannt sein, oder du musst sie festlegen. Sonst kannst du keine Matrix dimensionieren.
    Oooder aber du liest den ganzen Kram in ein Array ein, ooder in einen Vector, ooder ...


  • Mod

    Ich demonstriere:

    #include<string>
    #include<fstream>
    #include<vector>
    #include<sstream>
    #include<iostream>
    #include<cstdlib>
    
    using namespace std;
    
    void demonstrate_usage_of_vector_as_2d_array(int * matrix, int lines, int columns)
    {
      for (int i=0; i<lines; ++i)
        {
          for (int j=0; j<columns; ++j)
            {
              cout << matrix[i*columns + j] << '\t';
            }
          cout << '\n';
        }
      cout << endl;
    }
    
    int main()
    {
      vector<int> matrix;
      int lines,columns=-1;
    
      {   // Einlesen
        ifstream input("matrix");
        string line;
        while(getline(input,line))
          {
            int columncounter=0;
            stringstream lineparser(line);
            int element;
            while(lineparser >> element) 
              {
                matrix.push_back(element);
                ++columncounter;
              }
            if (columns==-1) columns=columncounter;
            if (columns!=columncounter)
              {
                cerr << "Fehler: Unterschiedliche Spaltenzahl in mindestens zwei Zeilen" << endl;
                exit(1);
              }
          }
      lines=matrix.size()/columns;
      }  // Einlesen fertig
    
      demonstrate_usage_of_vector_as_2d_array(&matrix[0], lines, columns);
    
    }
    

    Geht bestimmt auch eleganter, hatte aber keine Lust, lange nachzudenken. Ich denke, das Programm braucht keine Kommentare zur Erklärung, falls doch, einfach Nachfragen.



  • Vielen vielen SeppJ!

    Hätte noch ne kleine Frage bzgl meiner txt-Datei, nämlich wenn mehrere Matrizen in einer Datei stecken mit unterschiedlicher Anzahl von Spalten und Zeilen.

    Was wäre eurer Meinung nach der Leitfaden um die Matrizen solch eine Datei einzulesen.

    Bsp:

    =beg=50700 (Element Connectivities)
               20            25           31           32           26
               21            27            2           33           28
               22            28           33           34           29
               23            29           34           35           30
               24            30           35           36           31
               25            31           36            3           32
    =end=
    
    =beg=50800 (Nodal Coordinates)                                        
                1   0.000000E+00   0.100000E+02
                2   0.500000E+02   0.100000E+02
                3   0.500000E+02   0.100000E+03
                4   0.000000E+00   0.100000E+03
                5   0.000000E+00   0.280000E+02
                6   0.000000E+00   0.460000E+02
                7   0.000000E+00   0.640000E+02
                8   0.000000E+00   0.820000E+02
    
    =end=
    

Anmelden zum Antworten