C-Programm: Dateinamen in Array einlesen

  • Hallo!
    Ich habe mir einen debianbasierten MP3-Player mit LCD-Display gebaut, der ohne Maus, Tastatur und Monitor läuft.

    Ich habe mir verschiedene Playlists (sunny.lst, funky.lst, rainy_days.lst ...) erzeugt. Diese Dateien will ich nun in meinem C-Programm in ein Array einlesen um dann mit den Navigationstasten des Displays verschiedene Playlisten auswählen zu können.

    Etwas hab ich schon zusammengeschrieben, weiß nur nicht wie das richtig zusammensetzen muß:

    char **playlist_array[23]=0;
    char *buf=0;
    for(i=0;i<23;i++){
    buf=(char*)malloc(111);
    buf=get_next_playlist_name();
    playlist_array[i]=buf;
    }

    Das wesentliche steckt natürlich im get_next_playlist_name(). Da muss ich
    mit popen oder dem umweg über eine Datei (ls *lst>playlisten.txt)
    die namen nacheinander einlesen.
    Eleganterweise aus dem wirklichen Namen und Listenlänge die Größen der Arrays ableiten oder dynamisch anpassen.

    Die Idee ist da, nur weiß ich nicht wie ich das umsetzen soll.
    Kann mir jemand weiterhelfen!

    xxfunk

  • Zitat


    Das wesentliche steckt natürlich im get_next_playlist_name(). Da muss ich
    mit popen oder dem umweg über eine Datei (ls *lst>playlisten.txt)
    die namen nacheinander einlesen.
    Eleganterweise aus dem wirklichen Namen und Listenlänge die Größen der Arrays ableiten oder dynamisch anpassen.



    da gibt es mehrere moeglichkeiten.

    1. so wie du das gesagt hast:
    fork, umbiegen von stdout in eine pipe, exec des programms (zb ls) lesen aus der pipe.
    oefnnen der files und einlesen.

    2. dein programm mit commandline parametern aufrufen:
    dein_programm *.lst => sie shell expandet *.lst auf alle files und du
    hast sie alle in argv[1...] ... oeffnen der files, einlesen der files ...

    3. haendisch: man 3 readdir, man 2 stat

    lg
    amok

    ps:

    Code
    buf=(char*)malloc(111);
        buf=get_next_playlist_name();

    aufpassen, das ist garantiert ein memory leak.

  • Brauche ich eigentlich ein fork(). Die Playlisten werden eigentlich nur einmal am Anfang des Programms erzeugt und dann eingelesen. Das müßte ja nicht gleichzeitig passieren.
    system("ls -1p *.lst > all_playlists"); kombiniert ja eigentlich fork() und exec()!
    Klar ist mir noch nicht wie ich die Zeilen aus der Datei in ein Array gepackt kriege. Ich bekomme immer ein Segmentation fault Fehler.

    Das Programm soll als daemon laufen. Ich hab dazu eine Endlosschleife am Ende von main() eingebaut, so dass der Player ständig läuft. Wie kann man das anders lösen?

  • So jetzt noch etwas Quellcode sonst versteht ja niemand was ich meine:


    system("ls -1p /music/*.lst > /music/all_playlists");
    FILE *my_stream;
    char my_filename[] = "/music/all_playlists";
    char my_string[100];
    int number_of_playlists = 0;

    char *playlist_container;
    strcat(playlist_container, "xxx"); // segmentation fault

    my_stream = fopen(my_filename, "r");

    while( fgets (my_string, 100, my_stream) != NULL) {
    strcpy(playlist_container+number_of_playlists, my_string); // funktioniert nicht

    printf ("%s", playlist_container[number_of_playlists]);
    number_of_playlists++;
    }

    fclose (my_stream);
    printf("number_of_playlists: %d\n\n", number_of_playlists);



  • [QUOTE=xxfunkxx]

    Code
    char *playlist_container;
         strcat(playlist_container, "xxx"); [color=Red]// segmentation fault[/color]

    playlist_container ist ein pointer auf char der gerade auf irgendeine adresse
    zeigt die du nicht kennst weil du keinen speicherplatz reserviert hast. dann rufst
    du strcat auf und das versucht in genau diesen speicherplatz zu schreiben.

    Code
    while( fgets (my_string, 100, my_stream) != NULL) {
             strcpy(playlist_container+number_of_playlists, my_string); [color=Red]// funktioniert nicht[/color]
    
             printf ("%s", playlist_container[number_of_playlists]);        
             number_of_playlists++;
         }

    hier das selbe problem. playlist_container zeigt noch immer irgendwo hin, nur nicht in einen speicherbereich den du kontrollierst.

    lg
    amok

  • So, ich denke ich habs geschafft. Hab mir eine einfach verkettete List erzeugt in der dann die Dateinamen der Playlisten und ein Index gespeichert werden.




    Mit den Zeigern der Liste kann ich dann die entsprechende Playliste mit den Knöpfen des Display auswählen.
    War garnicht so schwer wie ich erst dachte.

    xxfunkxx

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!