Matrix/ 2D-Array aus txt-Datei einlesen

schickano

Grünschnabel
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 :D

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 :confused:

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

Code:
#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;
}
 
Hier ein kleiner Auszug aus der txt-Datei:

Code:
            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 wir davon aus das die Anzahl der Spalten und Zeilen unbekannt ist ;)
Wichtig ist, dass es ein 2D-Array vom Typ double sein muss, da ich mit dieser Matrix weitere mathematische Berechnungen durchführe.
 
Hallo!

Ich würde die Datei zeilenweise einlesen. In den einzelnen Zeilen kannst du dann immer die Zeichen bis zum nächsten Leerzeichen als ein Element auffassen. Dann weißt du auch, wie viele Spalten es gibt. Die Anzahl der Zeilen ergibt sich dann aus der Anzahl der eingelesenen Zeilen aus der Datei.
Also in etwa so:
C++:
short MAX = 100;
short k=1;
string arr[MAX][MAX];
ifstream fin("bla.txt");
for(short i = 0; i < MAX; i++)
{
getline(fin,arr[i][0],'\n');

for(short t =0; t < arr[i][0].length();t++)
{         
if(arr[i][0][t]!=' ')
arr[i][k] += arr[i][0][t];
else k++;
}
}
Das erste Element des Arrays speichert die komplett eingelesene Zeile.
k ist die Anzahl der Spalten und i die Anzahl der Zeilen.
So, oder so ähnlich...; das kann man dann noch in ein 2D-DoubleArray überführen.
lg kickerxy123

ps: Konvertieren kannst du das ganze dann so:
C++:
d_arr[i][k] = stringToDouble(arr[i][k]); //d_arr ist das double array
mit:
C++:
double stringToDouble (string str)
{   
 double ergebnis = 0.00;
 stringstream ss;
 ss << str;
 ss >> ergebnis;
return ergebnis;
}
lg
 
Zuletzt bearbeitet:
Hallo,

das kann man auch etwas knapper formulieren:
C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

int main(void) {
  ifstream ifs("daten.txt");

  if (!ifs) {
    cerr << "Datei kann nicht geöffnet werden" << endl;
    exit(-1);
  }
  
  vector<vector<double> > matrix;
  while (ifs) {
    string line;
    getline(ifs, line);
    istringstream iss(line);
    vector<double> values;
    copy(istream_iterator<double>(iss),
         istream_iterator<double>(),
         back_insert_iterator<vector<double> >(values));
    if (values.size() > 0) matrix.push_back(values);
  }

  cout << "Zeilen: " << matrix.size() << endl;
  cout << "Spalten (in 1. Zeile): " << matrix[0].size() << endl;

  return 0;
}

Grüße,
Matthias
 
Vielen vielen Dank Matthias und kickerxy123!

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:
Code:
=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=
 
Als erstes würde ich die Zeilen mit fscanf(datei,"%s\n",str) in einen String einlesen. Diesen String kannst du dann analysieren, um herauszufinden, ob es eine Kommandozeile, eine Leerzeile oder eine Datenzeile ist. Das Format deiner Datenzeile ist bekannt, und du kannst sie dann mit sscanf(str,"\t%d %f %f",ivar,dvar0,dvar1) oder ähnliches aufsplitten.
Im übrigen möchte ich hier auch wieder auf den AWK bzw. gawk hinweisen, der eine komfortable C-ähnliche Skriptsprache verwendet, um solche Probleme zu bewältigen; für GUI-Anwendungen ist er allerdings nicht geeignet.
 
Zuletzt bearbeitet:
Zurück