# [C++] einlesen von textdatei & speichern in array



## seros00 (2. April 2009)

Hallo,
ich muss derzeit eine Aufgabe bearbeiten und habe nur Erfahrung mit C. Die Aufgabe soll aber in C++ bearbeitet werden. Ich habe das nun  fertig geschrieben und erhalte beim Kompilieren auch keinen Fehler mehr. Allerdings gibt es wohl einen logischen Fehler im Programmaufbau (z.B. array speichert Werte falsch).

Hier nun die Aufgabenstellung: Es sollen double Werte aus einer Textdatei in ein 2 dimensionales Array gespeichert werden. Anschließend sollen ein paar Berechnungen durchgeführt werden. (Mittelwert der Spalte, StandardDeviation, Ausgabe der Anzahl der Spalten/Reihen).

Vielen Dank, falls ihr mir helfen könnt 

```
void readFromFile(string filename)
{
	array_rows=0;
	array_columns=0;
	string line;
	vector<string> lines;
	
	ifstream datei(filename.c_str(),ios::in);
    if (datei.is_open())
    {
        //An den Anfang der Datei springen
        datei.seekg(0L, ios::beg);		

		//Solange Datei noch nicht am Ende speichern wir die Zeilen in einen Vector
        while (getline (datei,line))
        {         
      		lines.push_back(line);
            array_rows++;     
        }
        datei.close();
        
        //Array anlegen und befuellen in dem wir zuerst rausfinden, wie groß das array sein soll (mit Hilfe von stringstream)
	    double buffer;
    	stringstream ss(lines[0]);
	    vector<double> tokens;
    
	    while(ss>>buffer)
	    	tokens.push_back(buffer);   
     
	    array_columns=tokens.size();
 
	     // 1. Schritt: Dynamische Array von Zeigern anlegen:
	    array = new double*[array_rows];

	    // 2. Schritt: An jeden Zeiger ein Array hängen
	    for (int j = 0; j < array_rows ; j++)
	        array[j] = new double[array_columns]; 

		//array angelegt => Werte aus Vector einspeichern
		for(int i=0; i<array_rows; i++)
		{
			for(int k=0; k<array_columns;k++)
			{
				stringstream ss(lines[i]);
				while(ss>>buffer)
				{
					array[i][k]=buffer;
				}
			}
		}
     
    }
}
```


----------



## vfl_freak (3. April 2009)

Moin,

und Willkomen bei tutorials.de 

Es wäre sicher gut, wenn Du Dein konkretes Problem spezifizierst! 
Ich glaube, dass die Wenigstens Zeit (und Lust) haben, sich durch Deinen Code zu wühlen, um einen _*logischen*_ Fehler zu suchen. Man müsste ja erstmal verstehen, was die einzelnen Funktion genau tun sollte, um entscheiden zu können, ob ein solches Fehlverhalten vorliegt!

Wo genau glaubst Du denn, wird was falsch gespeichert

Beim groben Überfliegen fiel mir nur Folgendes auf:
Wo ist Deine main-Funktion? Wie rufst Du das Programm denn auf?
Es fehlen Konstruktoren und Destruktoren für die Objekte!


```
double** array;
array = new double*[array_rows];
```
Dies ist bestenfalls ein eindimensionales Array von double-Werten!

Gruß
Klaus


----------



## enne (3. April 2009)

3 Zeilen weiter unten steht aber noch:

```
array[j] = new double[array_columns];
```


----------



## vfl_freak (3. April 2009)

Moin,



enne hat gesagt.:


> 3 Zeilen weiter unten steht aber noch:
> 
> ```
> array[j] = new double[array_columns];
> ```



genau - und das ist so halt eindimensional ;-]
2D wäre es nur, wenn "array_columns" auch ein Array  wäre, ist bei Dir aber 'nur' ein Integer ...

Vielleicht helfen Dir ja diese Seiten weiter:
http://www.willemer.de/informatik/cpp/array.htm
http://www.c-plusplus.de/forum/viewtopic-var-t-is-39489.html
http://www.tutorials.de/forum/c-c/137994-c-mehrdimensionales-array.html
(Das sind die ersten Ergebnisse einer kurzen  mit "zweidimensional Array C++"! Da gibt es noch jede Menge mehr zum einlesen!)

Gruß
Klaus


----------



## deepthroat (3. April 2009)

Hi.





vfl_freak hat gesagt.:


> genau - und das ist so halt eindimensional ;-]


Das siehst du falsch. Es ist ein zwei-dimensionales Array - ein Array von Arrays.

@seros00: Du solltest wirklich eine konkrete Problembeschreibung liefern und besser auch noch ein lauffähiges Minimalprogramm, welches man kompilieren kann.

Gruß


----------



## vfl_freak (3. April 2009)

Moin,

jau, hast Recht - habe das "[j]" irgendwie nicht registriert .... 
Entweder ist es noch zu früh - oder es liegt an der Sommerzeit :-(

Gruß
Klaus


----------



## Mizi Mace (3. April 2009)

Einen wunderschönen guten Morgen,

du willst also ein zweidimensionales Array aus einer Datei auslesen, dessen Dimensionen du vorab nicht kennst. Du hast einen Fehler in der Methode readFromFile(string filename) und zwar beim Übertragen der Zeilen (lines) mittels Stringsstream in die Elemente einer Zeile des Array:


```
//array angelegt => Werte aus Vector einspeichern
for(int i=0; i<array_rows; i++)
{
	for(int k=0; k<array_columns;k++)
	{
		stringstream ss(lines[i]);
		while(ss>>buffer)
		{
			array[i][k]=buffer;
		}
	}
}
```

Hier gehst du Zeile für Zeile vor. Dann behandelst du jede Spalte. Und nun kommt der bzw. kommen die Fehler. Du liest für jede Spalte den String erneut in den Stream, obwohl doch der String eine Zeile darstellt. Dann liest du nacheinander alle Elemente aus den Stream aus und schreibst diesen in das Array (while-Schleife). Dabei überschreibst du natürlich jedes mal das Element. Es sollte somit in jedem Element einer Zeile des Arrays immer das letzte Element der Zeile des Strings stehen.

Meine Glaskugel war wohl heute mal voll funktionsbereit. *g* Bei der nächsten Anfrage bitte das Fehlersymptom mit beschreiben bzw. konkret angeben. Das hilft den Helfern beim Helfen.

Die Korrektur überlasse ich dir.

Gruss
Mizi


----------



## seros00 (3. April 2009)

Entschuldigung, dass ich das Problem nict genauer spezifiziert habe. Hab den Fehler aber schon in der Einlesefunktion erwartet. Vielen Dank also für Eure Hilfe, Mici Maze hat ihn gefunden. Hab ihn jetzt fertig ausgemerzt und klappt alles  Danke!


----------

