Spaltenweise aus txt Datei einlesen



  • Funktioniert nicht ist eine sehr vage Aussage.
    Poste mal den Dateiinhalt, die Ausgabe und prüfe bitte die Rückgabewerte, insbesondere von fopen, ob die Datei überhaupt geöffnet werden konnte.
    Und zum anderen was fscanf zurückgibt, denn fscanf gibt dir die Anzahl der gelesenen Parameter zurück.



  • Also meine zu lesende txt-Datei sieht so aus:

    Herr der Ringe | Fantasy | 3
    Ice Age 2 | Zeichentrick | 7

    Als Rückgabewert von fscanf bekomme ich die "1". (Das müßte stimmen)

    und als Ausgabe auf dem Bildschirm (Konsole) erhalte ich folgendes wirwarr..

    Herr | ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Herr | -858993460



  • Die Rückgabe von fscanf ist die Anzahl von gelesenen Argumenten, d.h. du solltest vor der Ausgabe überprüfen, ob fscanf 3 zurückgibt.

    Da das Zeichen '|' immer als Trennzeichen benutzt wird, ist es hier deutlich einfacher die gesamte Zeile mittels man: fgets(3) einzulesen und diese mit man: strtok(3) zu parsen.



  • Diese strtok Funktion kannte ich nicht.
    VIELEN DANK!!!

    Werds gleich mal ausprobieren...

    Wenn ich das ganze aber mit ner fscanf Funktion realisieren würde, weist du dann wie ich das machen müßte? Will ja aus meinen Fehlern lernen *g*



  • probier mal damit (Fehlerbehandlung und so solltest du selber hinkriegen)

    void read_dvd(void)
    {
        char title[21], genre[21], line[1024];
        unsigned int anzahl;
        char *tok;
        FILE * fp;
    
        fp = fopen("dvd.txt", "r");
    
        if(fp == 0) return;
    
        while(fgets(line, 1024, fp))
        {
          line[strlen(line) - 1] = 0; 
          title[sizeof(title)-1] = genre[sizeof(genre)-1] = 0; 
    
          tok = strtok(line, "|"); 
          strncpy(title,tok, sizeof(title)-1);  
    
          tok = strtok(NULL, "|"); /* das NULL ist hier NOTWENDIG */ 
          strncpy(genre, tok,sizeof(genre)-1);  
    
          tok = strtok(NULL, "|");  
          anzahl = atoi(tok); 
          printf("%s | %s | %d\n",title ,genre, anzahl); 
        } 
      fclose(fp); 
    }
    

    Bei fscanf musst du nur das richtige Format eingeben. Ich wüsste nicht, wie du da am besten machst (ohne selber lange rum zu experimentieren), da ich scanf Funktionen (deswegen) selten benutze.



  • Habs ausprobiert. Funktioniert wunderbar!!!
    Also nochmals vielen Dank!!

    Das mit fscanf währ halt in meiner vorstellung geschickter gewesen, da ich später mal Suchkriterien in die Funktion übergeben möchte (ähnlich wie in einer Datenbank) und mir dann anhand von den Kriterien nur die entsprechenden Filme anzeigen lassen bzw. weiter verarbeiten lassen wollte.



  • Ich kann dir sagen warum scanf nur den ersten Parameter einliest:

    Das Format lautet: <String><Leerzeichen><|>{usw.}
    Dein erstet Titel lautet: <Herr><Leerzeichen><der><Leerzeichen><Ringe>

    scanf liest den string Herr, dann sieht es das Leerzeichen und danach sollte ein | kommen, tut es aber nicht und scanf bricht ab.



  • So, nach den ganzen Hilfen von gestern bin ich mit meinem Programm ein gutes Stück weiter gekommen.
    Allerdings stehe ich nun vor einem neuen Problem. Ich möchte eine bestimmte Zeile aus meiner txt Datei löschen.

    1 | Herr der Ringe | Fantasy | 3
    2 | Ice Age 2 | Zeichentrick | 7
    3 | Stirb langsam 4 | Action | 44

    Also z.B. die 2. Zeile.
    Wie stelle ich das denn am besten an? Gibt es da vieleicht auch eine Funktion, die das löschen übernimmt? Hab schon gesucht, aber leider nichts gefunden.

    Ps.
    Ich wollte dewegen nicht extra einen neuen Beitrag aufmachen, ich hoffe das ist ok.



  • Einzelne Zeilen einer Datei kannst du nicht direkt löschen, sondern du mußt entweder alle Daten einlesen, dann die Zeile löschen und dann wieder abspeichern.
    Alternativ könntest du auch noch die Zeile mit einem Dummy-Zeichen überschreiben (welches du dann beim Lesen ignorierst).



  • Dankeschön für deine Hilfe.
    Hab mich für die Möglichkeit entschieden alles bis auf die zu löschende Zeile in eine neue Datei zu schreiben und diese dann über rename in die Ursprunsdatei umzubennen.


Anmelden zum Antworten