"Übung macht den Meister" oder "Verdammt ich will doch nur die Datei auslesen"



  • Einen wunderschönen Tag beisammen,

    meinereiner kam als anlernender C'ler auf die herrliche Idee ein Programm zu schreiben dem ich ein Verzeichniss mitgebe, welches dann Rekursiv durchgeht und mir eine schöne Playlist für mein WinAmp erstellt (hat keinen großen Sinn ich weiß, aber zum üben doch gnaz lustig).

    So, um die Playlist zu erstellen müsste ich im besten Falle Zeit, Interpret und Titel in Erfahrung bringen, um die letzteren beiden zu erhalten dachte ich mir mal den ID3v1-tag auszulesen.
    Alles schön und gut, ein bischen rumgewühlt und so kam raus das der TAG sich in den letzten 128Byte der Datei verstecken soll.

    Als ich einfach mal probieren wollte die letzten 128Byte auszulesen schrieb ich das kleine Progrämmchen da unten.

    Soweit zur Entstehungsgeschichte, nun das Problem:
    Es erscheint keine Ausgabe, wo ist der Denk/Programmier-fehler ?

    #include <utility.h>
    #include <stdio.h> 
    #include <stdlib.h> 
    
    void main(void) { 
      char szBuffer[128];
      FILE * FilePointer; 
    
      Cls(); 								  
    
      FilePointer = fopen("F:\\FTP\[mp3]\\Metallica - Star Wars Imperial March.mp3","r"); 
    
      fseek(FilePointer, 128L, SEEK_END);
      fgets( szBuffer, sizeof(szBuffer), FilePointer);
      printf("%s",szBuffer);
    
      fclose(FilePointer); 
    }
    


  • 1. Nicht alle MP3 haben den v1-Tag.
    2. Du solltest im ausgelesenen Puffer vielleicht noch zunächst mal alle 0x00-Bytes durch 0x20-Bytes ersetzen.
    3. Solltst du das File binär öffnen und auch binär auslesen (fread) sonst kann das dumme Folgen haben.

    -junix



  • Tag,

    Sollte es nicht fseek(fp,-128L,SEEK_END); heissen ?



  • Danke für die flotte Antwort 🙂

    zu 1. aber in allen Tags sind Titel & Artist an der selben Stelle, von daher mal egal, aber zur Not les ich erst den Header aus, das klappt immerhin schon.

    zu 2. eh, ja , da mach ich mich mal schlau, Ansätze sind gut, danke :D.
    zu 3. Binaer hatte ich auch schon probiert, war das selbe Ergebnisse :(.



  • bei Minus gibt er direkt Fehler aus, aber könnte mir vielleicht jemand sagen welchen Sinn das L hat ?

    fseek(fp,128L,SEEK_END);

    Hab die Zeile aus nem buch benutzt und da steht leider nciht wozu das L dient.



  • @prolog stimmt, das kommt sogar noch dazu (o: das wirds vermutlich gewesen sein (O:

    -junix



  • Galeon schrieb:

    bei Minus gibt er direkt Fehler aus

    was für fehler?

    -junix



  • Aije, abtippen ^^

    Also, LabWindows meckert:

    Function fseek: (return value == -1 [0xffffffff]).
    (EINVAL) Invalid argument



  • Tag,

    Das L soll deutlich machen dass es sich um einen long-wert handelt.
    Das kann man im prinzip auch weg lassen.

    Welcher Fehler wird denn ausgegeben, wenn du -128L benutzt ?



  • Danke :), hab mich schon gewundert, weil es eben keinen Effekt hatte ob es da stand oder nicht.



  • HM, fürs erste ok, habs jetzt so gebastelt:

    FilePointer = fopen("C:\\test.mp3","rb"); 
    
      // Größe
      while (1) {
        (void) fgetc(FilePointer);
        if( feof(FilePointer) != 0) {
          break;
        }
        ulCount++;
      }
      // Größe
    
      fseek(FilePointer, ulCount-128, SEEK_SET);
    

    Ist zwar noch nicht optimal, vorallem das ermitteln der Größe dauert doch sehr lange.
    Jetzt muss ich nur nich was mit der Ausgabe (?òÌ?÷T) anfangen können *muahah*



  • Selbst wenn fseek(filepointer, -128L, SEEK_END); nicht geht, ist das eher die mieseste Lösung die du benutzen konntest. Wenn schon unbedingt nen Workaround, dann spring doch einfach mit
    fseek(fp, 0, SEEK_END);
    ans Ende, lass dir von ftell den Wert geben und rechne den minus 128. Anschliessend springst du mit
    fseek(fp, ftellwertminus128, SEEK_BEG)
    an die passende Stelle.
    Alles Andere ist eher etwas müllig.

    -junix



  • Edit, ist ok, einfach ignorieren was hier stand ^^


Anmelden zum Antworten