datei ausgeben (mp3)...



  • habe mal folgendes gemacht ...

    Memo1 -> Clear();
     RichEdit1 -> Clear();
     ifstream datei;
     datei.open("c:\\pop.mp3", ios_base::out | ios_base::in | ios::binary);
    
     char chh;
     char ch[101];
    
    if (datei)
    {
     for (int i = 0; i <= 100; i++)  // <----- die hundert muss weg !!!!
      {
       chh = datei.get();// Zeichen aus der Datei holen
    //   datei.get(ch,15,' + ');
       ch[i] = chh;   // einlesen von zeichen in ein array 
       Memo1 -> Lines -> Add(chh); // zeichen werden untereinander ausgegeben 
       RichEdit1 -> Lines -> Add(ch); //wenn ich chh ausgebe kommt ein fehler 
    }
    }
    

    will aber alles nacheinander ausgeben und nicht untereinander !!!

    p.s.: folgend aus beitrag = http://www.c-plusplus.net/forum/viewtopic.php?p=804797#804797



  • äh, was genau versuchst Du denn da? Eine MP3-Datei zu öffnen und zeichenweise auszulesen??

    Mit ->Add() fügst Du eine neue Zeile hinzu, das ist so gewollt. Wenn Du etwas nebeneinander haben möchtest, mußt Du das zuerst in einen AnsiString oder String oder char[] schreiben und diesen dann 'Add'en.

    z.B.

    AnsiString OutString;
    for (int i = 0; i < 10; i++)
      OutString += AnsiString(i);
    RichEdit1->Lines->Add(OutString);
    


  • AnsiString AS_ch;
    
    for (int i = 0; i <= 100; i++) 
     {
      ch = datei.get(); // Zeichen aus der Datei holen
    
      AS_ch += ch;      // Zeihen an einem AnsiString aufreihen
     }
    
    Memo1 -> Lines -> Add(chh);    // es werden nur 4 zeichen aufgegeben
    //RichEdit1 -> Lines -> Add(ch); <- habe ich weggelassen, nur fehlermeldungen
    

    siehe kommentare

    wieso werden nur 4 zeichen ausgegeben !!
    habe doch gesagt das 100 zeichen theoretisch ausgegeben werden sollen,

    bei textdokumente is das kein problem, da werden auch 100 zeichen ausgegeben,

    ich kann da auch "end of file" schreiben:

    do
    {
    .... 
    }while(datei.eof());
    

    das funzt aber nicht weil mp3's kein eof besitzen,
    wie soll ich das sont machen ???

    ich will nur die id3 tags ausgeben !!!

    aber erst mal die zeichen ausgeben, vergleichbar mir dem notepad von windows,

    ich weiss auch wie groß alles sein muss,
    http://www.id3.org/id3v1.html
    zumindest v1 ist nicht so schwer, wie ich zuerst fand !!! 😞

    Song title 30 characters
    Artist 30 characters
    Album 30 characters
    Year 4 characters
    Comment 30 characters
    Genre 1 byte



  • Versuche es doch mal so:

    TStringList * StringList1 = new TStringList;
      StringList1->LoadFromFile("C:\\Temp\\test4.doc");
      Memo1->Text = StringList1->Text;
      delete StringList1;
    


  • textdateien werden komlett ausgegeben !

    aber bei mp3's wird nur

    ID3
    (und ein viereck wird ausgegeben, nicht zu sehen, also 4 zeichen )

    vielleicht mache ich was falsch ??



  • Huberts schrieb:

    aber bei mp3's wird nur
    ID3
    (und ein viereck wird ausgegeben, nicht zu sehen, also 4 zeichen )

    ...und wenn du die ersten 4 Zeichen ausläßt und ab dem 5. Zeichen liest? Was bekommst du dann?



  • so klappt es bei mir:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    String FileName = "C:\\Temp\\test.mp3";
    String Line = "\0";
      {
      try
        {
        // Filehandel holen
        int FileHandel = FileOpen(FileName, fmOpenRead);
        // Filegröße ermitteln
        long FileSize   = FileSeek(FileHandel, 0, 2);
        // an den Anfang der Datei gehen
        FileSeek(FileHandel, 0, 0);
        // einen char Buffer mit Größe des Files anlegen
        char * Buffer = new char[FileSize];
        // File in den Buffer einlesen
        FileRead(FileHandel, Buffer, FileSize);
        // optional: Memo1 auf unsichtbar stellen, dann gehts ein bisschen schneller
        Memo1->Visible = false;
        // Byteweise durch den Buffer
        for (int i = 0; i <= FileSize; i++)
          {
          // Aktuelle Buffer Position in einen AnsiString kopieren
          Line += Buffer[i];
          // nach 32 Bytes neue Zeile
          if (i % 32 == 0 || i == FileSize)
            {
            // Zeile ausgeben
            Memo1->Lines->Add(Line);
            // String löschen
            Line = "\0";
            }
          }
        // Memo wieder sichtbar stellen
        Memo1->Visible = true;
        // WICHTIG: Buffer löschen
        delete[] Buffer;
    
        }
      catch (Exception &exception)
        {
        ShowMessage(exception.Message);
        }
      }
    }
    

    der Code ist aber SEHR langsam!
    In dem MP3 mit dem ich es versucht habe waren die ID Tags am Ende der Datei.



  • schön,
    aber scheint nicht 100% alles auszugeben !

    bei der ausgabe wird text abgeschnitten, und wahllos irgendwo im text ein return gesetzt,
    zb:

    I
    D3
    TCON
    Chim Chim Cheree (clip)TPE1
    
    wo eigentlich:

    ID3    
    TALB   
       Mary PoppinsTCON      SoundtrackTIT2      Chim Chim Cheree (clip)TPE1
    

    ausgegeben weren soll

    wie man sieht wird text angeschnitten !!
    **
    edit:**

    long FileSize = FileSeek(FileHandel, 0, 2);
    // an den Anfang der Datei gehen

    wenn jemand sagt wie man zu einer bestimtne posisition in einer datei springt können wir zeit sparen !!!



  • wenn jemand sagt wie man zu einer bestimtne posisition in einer datei springt können wir zeit sparen !!!
    

    Siehe hilfe zu FileSeek.



  • Hallo,

    Bezüglich des Abschneidens von Text:
    Dein mp3-File ist nunmal kein Textfile. Wenn da also eine binäre 0 vorkommt wird der String abgeschnitten. Bei anderern nicht darstellbaren Zeichen (Tab, CR) passiert ähnliches. Im folgenden Thread ist das schonmal etwas ausfühlicher erklärt worden
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-69571

    Ciao


Anmelden zum Antworten