# Datei auslesen und in variablen speichern



## yunus219 (10. Dezember 2010)

Hallo,

ich habe folgendes Problem: Ich habe eine Datei, in der z.B.: 
"RECT 1 2 3 4
SQUARE 2 4 5"

gespeichert ist.

Nun möchte ich die Zeilenweise in einem Array speichern.

Wie könnte ich es verwirklichen ****

mfg yunus219


----------



## Trulleberg (10. Dezember 2010)

In C und mit dynamischer Speicherallokierung z.B.


```
int anzahl = 0, i;
char **zeilen = NULL, zeile[100];
FILE *f = fopen("datei.txt","r");
while( fgets(zeile,100,f) )
{
  zeilen = realloc(zeilen, ++anzahl * sizeof(*zeilen));
  zeilen[anzahl-1] = malloc( strlen(zeile)+1 );
  strcpy(zeilen[anzahl-1],zeile);
}
fclose(f);
for(i=0;i<anzahl;i++)
  printf("%s", zeilen[i] );
```

Die Ergebniszeilen besitzen meist noch jeweils ein abschließendes '\n', was je nach weiterem Verwendungszweck stört oder nicht.


----------



## yunus219 (11. Dezember 2010)

Sorry,

ich habe vergessen zu erwähnen, dass ich es in C++ verwirklichen möchte.
Dankeschön für die schnelle Antwort Trulleberg, aber ich bekomme die Fehlermeldung "invalid conversion from void to char", da ich es in C++ haben will, anstatt von C.


----------



## Trulleberg (11. Dezember 2010)

Das ist ganz normal, dass Fehlermeldungen auftreten, wenn man versucht, mit einem C++ Compiler C Code zu übersetzen. Ich habe ja auch extra drübergeschrieben, dass es sich um C handelt.
Setze vor die *alloc-Funktionen (char**) bzw. (char*) und gut is.


----------



## Crash Kid (11. Dezember 2010)

Hey,

du kannst es auch so machen:


```
#include <fstream>
#include <string>

using namespace std;

fstream fDatei;
string stInhalt;
int iZahl;

fDatei.open("C:\\test.dat", ios::in | ios::binary);  //Öffne die Datei 'test.dat'
if(fDatei.good())  //Überprüfung ob sie geöffnet werden konnte
{
    for(iZahl = 1; iZahl <= 1; ++iZahl)  //Auslesen der 1. Zeile
    {
        getline(fDatei, stInhalt);
    }
    
    fDatei.close();  //Schließe die Datei
}
```

Du kannst hiermit genau festlegen, welche Zeile du auslesen willst.
Ob die 1., 2., usw., jenachdem wie weit die for()-Schleife hochzählt.
Um die 5. Zeile auszulesen, musst du sagen "for(iZahl= 1; iZahl <= 5; ++iZahl);"
Der Inhalt steht in der string-Variablen "stInhalt" drin.

Hoffe ich konnte dir helfen...
P.S.: hier steht alles über die fstream-Funktionen: http://www.willemer.de/informatik/cpp/fileop.htm

gruß


----------



## yunus219 (11. Dezember 2010)

Hallo nochmal,

Danke für Eure schnelle Antworten, mit der getline habe ich es auch schon gehabt, nur mein Problem ist dann, dass ich dann die ganze Zeile in einem String habe. Ich möchte es ja in einem Array haben.


----------



## Crash Kid (11. Dezember 2010)

Du kannst ja den string-Inhalt in ein Array schreiben. Das ist ja kein Problem.
Dafür gibt es ja die Funktion strcpy(), und bezüglich der größe kannst du ja den string überprüfen wie groß er ist, und ein entsprechend großes Array erstellen.

gruß


----------



## yunus219 (12. Dezember 2010)

Hallo nochmal,

ich habe immer noch keine Lösung für meinen Problem gefunden.
Ich bekomme alles ausgelesen, nur bekomme ich das dann nicht seperat in den Array, wie ich es haben möchte.

Ich möchte es so haben:

1. Zeile: RECT 11 2 13 4 -->  string s[zeilennr]="RECT"          int i[zeilennr][0]=11 ...... int i[zeilennr][3]=4
2. Zeile: SQUARE 21 4 5 -->  string s[zeilennr]="SQUARE"      int i[zeilennr][0]=21 ...... int i[zeilennr][2]=5


----------



## Trulleberg (12. Dezember 2010)

Das Problem bei Anfängern ist, dass sie meist zwar vage Vorstellungen vom Ziel ihrer Programme haben, aber schon ganz genau wissen, wie der Weg dahin aussehen muss. Genauso bei dir, da du einerseits "eine Zeile in *einem Array*" haben willst, dich aber jetzt plötzlich doch für mehrere Arrays entschieden hast: "string [], int[], ...".
Schau dir mal Strukturen an, damit wenigstens etwas Systematik in deine Arbeitsweise kommt.


----------

