# fscanf // Zeilenweises Einlesen aus einer .txt Datei



## Kiesen (12. Jun 2014)

Hallo liebe Gemeinde,

ich versuche gerade ein Programm zu entwickeln, welches eine .txt Datei zeilenweise einliest und in eine selbst erstellte struct einfügt. Aber soweit komme ich gar nicht. Ich bin schon mit dem Debugger drüber und habe gesehen, dass die Adresse des Pointers auf die .txt zeigt. Aber irgendwie funktioniert die Methode fscanf nicht. 

Dies ist mein Code in der main: 


```
int main(void) {

    char* titel;
    int release;
    int length;
    char* regisseur;
    
    char filename[FILENAME_MAX];
    char line[MAXLINE];
    FILE *filepointer;
    size_t p;
    
    printf("Which File should be opend? (Needs to be in the same directory): ");
    fgets(filename, FILENAME_MAX, stdin);
    
    //Entfernt new line und setzt end of line 
    p = strlen(filename);
    filename[p-1] = '\0';
    
    filepointer = fopen(filename, "r");
    
    if(filepointer == 0) {
        printf("File can´t be opend!\n");
        return EXIT_FAILURE;
    
    } else {
        
        //Zählt die Zeilen in der .txt Datei 
        while(fgets(line, MAXLINE, filepointer)) {
            getlinenumbers = getlinenumbers+1;
        }
        
        //Erstellt i mal die movie struct. Liest nun Zeilenweise die .txt ein, bekommt die infos zu dem Film und fügt diese in die movie struct ein.  
        movie* input_movie[getlinenumbers];
        while(fscanf(filepointer, "%[^;];%d[^;];%d[^;];%[^;]", titel, &release, &length, regisseur) != EOF) {
            input_movie[i] = new_movie(titel, release, length, regisseur);
            i++;
        }
        
        for(int j = 0; j<i; j++) {
            printf("%s, %d, %d, %s", input_movie[j]->titel, input_movie[j]->release, input_movie[j]->length, input_movie[j]->regisseur);
        }
            
        
    }
    return EXIT_SUCCESS;
}
```

Vielleicht weiß ja jemand eine Lösung zu meine Problem.


----------



## MyOuzo (11. Jul 2014)

Erstmal herzlichen glückwunsch, dass du C++ gewählt hast 

Der Code sieht aber trotzdem C ähnlicher, wie wärs wenn du die Bibliothek "fstream" verwendest und alles mit "ifstream dat_ein" einliest. Jedes mahl wenn du dann dat_ein ausführst ( es kann auch ein beliebige andere Name sein ) wirden die Zeichen bis zu einem Leerzeichen / Zeilenumbruch eingelesen, Was man prima in einer Schleife durchlaufen kann.

Z.b.


```
#include <iosteam>
#include <fstream>
#include <string>
using namespace std;

int main()
{
 cout << "Hallo Welt" << endl; // printf Äquivalent

 ifstream dat_ein;
 string dateiname = "test.txt"

// Datei öffnen
dat_ein.open(dateiname.c_str(), ios_base::in);

if(!dat_ein) return -1; // Fehler

string text;
string text2;

dat_ein >> text // Wenn in der .txt "Ouzo" steht wird text ouzo zugewiesen
dat_ein >> text2 // Weist text die Zeichenketten nach Ouzo bis zum nächsten Tabulator / Leerzeichen / Zeilenumbruch zu.

return 0
}
```

Schleife:


```
//...
int anzahl = 9;
string spirituozen[anzahl];

for(int loop = 0; anzahl-1 > loop; loop++) dat_ein >> spirituozen[loop];
//...
```

By the way an die Forumadmins ( falls es welche gibt ), ich bestehe darauf, dass C++ - Tags implementiert werden


----------

