IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème avec fread


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par défaut Problème avec fread
    Bonjour, je vous écris car je rencontre actuellement d’important problème concernant mon projet de langage C
    Mon problème porte sur la lecture des tags ID3 dans un fichier mp3.
    Le TAG d’un fichier mp3 ID3 est composé de la sorte : (ceci est un exmple…)

    3 caractères : ID3
    1 caractères : Version
    6 caractères : "Divers"
    4 caractères : TIT2
    2 caractères : Flags
    2 Caractères : Taille du titre
    3 caractères : divers…..Etc

    Mon problème ce situe lors de la lecture de la taille du titre, ou taille de l’album, ou taille du nom de l’artiste… En effet je n’arrive pas à convertir la taille récupérer en entier.

    Je vous fait parvenir ci-dessous la procédure d’extraction du tag. Je vous précise que celle si n’est pas pour le moment complète. Mais rencontrant le problème ou je n’arrivais pas à lire la taille du titre, je souhaiterais que vous m’expliquiez s’il vous plaît ou ce trouve le problème. Merci d'avance pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     
    // Extraction TAG des MP3 - NE FONCTIONNE PAS
    void Extraction(char *nomfichier)
    {
     
      FILE *ptr_fichier;
     
      char *ptr_poubelle;
      char LONGUEUR[0];
      char ID[2];
      char TITRE[3];
      int  taille;
     
      char titrecomplet[15];
      char artistecomplet[15];
      char albumcomplet[15];
     
      // ouverture du fichier en lecture  
      ptr_fichier=fopen(nomfichier,"r");
     
      if (ptr_fichier == NULL)
      {
        perror("Erreur d’ouverture du fichier") ;
        exit(0) ;
      }     
      // le fichier est trouvé
      else
      {
     
       // lecture des 3 premiers caractères du fichiers mp3 : ID3
       fread(ID,sizeof(char),3,ptr_fichier);
       strcat(ID,"\0");
       printf("ID : %s \n",ID);
     
       // on passe la version, le flag et la taille du tag pour le moment
       fread(ptr_poubelle,sizeof(char),7,ptr_fichier);
     
       // Lecture de 4 caractères du fichier mp3 : TIT2
       fread(TITRE,sizeof(char),4,ptr_fichier);
       strcat(TITRE,"\0");
       printf("TITRE : %s \n",TITRE);
     
       // on passe le flag
       fread(ptr_poubelle,sizeof(char),3,ptr_fichier);
     
    //PROBLEME
       // lecture de la taille du titre sur 2 caractères en hexa. : ne fonctionne pas correctement
       fread(LONGUEUR,sizeof(char),1,ptr_fichier);
       strcat(LONGUEUR,"\0");
       printf("Taille : %s \n",LONGUEUR);
       // convertion de la taille du titre en hexa en decimal : ne fonctionne pas
       taille = strtoul(LONGUEUR, NULL, 16);
       // Affichage de la taille du titre
       printf("Taille du titre : %d \n",taille);
    // FIN DU PROBLEME   
     
       /*
       // On passe le flag
       fread(ptr_poubelle,sizeof(char),3,ptr_fichier);
       
       // on lit le titre sur la taille trouvé précédement
       fread(titrecomplet,sizeof(char),(taille-1),ptr_fichier);
       // affichage du titre complet
       printf("Titre du morceau : %s \n",titrecomplet); 
       
       */
     
      }         
       fclose(nomfichier);  
    }
    Merci pour vos réponses et vos aides.

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Je n'ai pas testé ton programme mais à vu de nez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char ID[2];   
    // lecture des 3 premiers caractères du fichiers mp3 : ID3
    fread(ID,sizeof(char),3,ptr_fichier);
    strcat(ID,"\0");
    printf("ID : %s \n",ID);
    Rien ne te dérange?

  3. #3
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par défaut
    Le problème n'est pas franchement la. Et je tiens compte du fait que c'est 0,1,2, donc ça fait bien 3 caractères.

    Mon problème viens vraiment du fait que j'arrive pas à extraire la taille du titre. C'est à dire le nombre de caractères du titre.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La remarque de nicolas.sitbon ne porte pas sur le 3 du fread, mais sur son incompatibilité avec le 2 ici :
    ID est trop petit et tu vas écraser ce qui se trouve placé derrière ton tableau.
    Sa taille minimum est 4 (3 caractères lus + le 0 ajouté derriere)

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Tu crées un tableau vide et tu veux écrire dedans ??

    Si la taille du titre est bien de deux caractères, il faut que tu au moins 3 caractères dans ton tableau : les deux caractères plus la '\0' final.... Mais ça rejoint le problème soulevé par nicolas.stibon.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Par défaut
    Ok j'ai changé mais ca ne fonctionne pas mieux non plus. Je suis dsl mais je galere comme un fou parce que j'arrive pas à lire c'est ID3 V2 et en extraire le titre, l'album et l'artiste pour créer des playlists.

    Si quelqu'un a déjà fait ce genre de chose, je serais interressé de savoir comment il s'y est pris. Merci.

    En gros je voudrais sortir le titre, l'artiste et l'album d'un fichier mp3 avec un id3 v2 ou v2.3 pour pouvoir faire les playlists après. Voilà j'aurais du vous préciser ça avant ça vous aurez permis de mieux comprendre pourquoi je faisais ces manipulations.

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par sergedarkmaul Voir le message
    En gros je voudrais sortir le titre, l'artiste et l'album d'un fichier mp3 avec un id3 v2 ou v2.3 pour pouvoir faire les playlists après. Voilà j'aurais du vous préciser ça avant ça vous aurez permis de mieux comprendre pourquoi je faisais ces manipulations.
    Hum, ce n'est pas aussi simple de lire les info ID3v2 d'un fichier mp3... Les info sont stockées par frame.

    Le format ID3v2 : http://www.id3.org/id3v2.3.0#head-e4...65c21fba4e0acc


    Un petit bout de code qui te permettra de commencer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    typedef struct ID3v2_s {
        char ID3[3];
        char version[2];
        char flag[1];
        char size[4];
        int valid;
    } ID3v2;
     
    typedef struct frame_s {
        char ID[4];
        char size[4];
        char flag[2];
    } FRAME;
     
    static long array2long(char array[4]) {
        long size = 0;
        size_t i;
        for(i = 0; i < 4; ++i) {
            size *= 0x80;
            size += (int)(array[i]%0x80);
        }
        return size;
    }
     
    static ID3v2 read_header(const char* filename) {
        ID3v2 ret = {"", "", "", "", 0};
     
        FILE *f = fopen(filename, "rb");
        if(NULL != f) {
            /* Lecture du header principal */
     
            fread(ret.ID3, 1, sizeof ret.ID3, f);
            fread(ret.version, 1, sizeof ret.version, f);
            fread(ret.flag, 1, sizeof ret.flag, f);
            fread(ret.size, 1, sizeof ret.size, f);
     
            /* Le tag est-il valide ?*/
            if(0 == strncmp(ret.ID3, "ID3", 3)) {
                long size = 0;
                FRAME frame;
                ret.valid = 1;
                /* on tente de lire chaque frame */
                while( 1 == fread(&frame, sizeof frame, 1, f) ) {
                    size = array2long(frame.size);
     
                    /* frame vide ? on sort */
                    if((0 == size)||(0==strncmp(frame.ID, "\0\0\0\0", 4))) {
                        break;
                    }
     
                    /* affichage du type de frame */
                    printf("frame %c%c%c%c found\n", frame.ID[0], frame.ID[1], 
                           frame.ID[2], frame.ID[3]);
     
                    /* Comme on a lu les specif, on sait que TALB, c'est le 
                       titre du morceau*/
                    if(0 == strncmp(frame.ID, "TALB", 4)) {
                        long i;
                        printf("titre : ");
                        for(i = 0; i < size; ++i) {
                            putchar(fgetc(f));
                        }
                        putchar('\n');
                        /* la frame a été lue, on passe à la suivante */
                        continue;
                    }
                    /* on passe le reste de la frame */
                    fseek(f, size, SEEK_CUR);
                }
     
            }
            fclose(f);
        } else {
            perror(filename);
        }
     
        return ret;
    }
     
    int main(int argc, char *argv[]) 
    {
        if(2 == argc) {
            ID3v2 tag = read_header(argv[1]);
            if(tag.valid) {
                printf("tag : %s\n", tag.ID3);
                printf("version : 0x%02x%02x\n", tag.version[0], tag.version[1]);
                printf("size : 0x%02x%02x%02x%02x\n",tag.size[0], tag.size[1], 
                       tag.size[2], tag.size[3]);
            }
        } else {
            fprintf(stderr, "usage : %s file.mp3\n", *argv);
        }
     
        return EXIT_SUCCESS;
    }

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       fread(ID,sizeof(char),3,ptr_fichier);
       strcat(ID,"\0");
    Ce type de code est incorrect : strcat ne fonctionne que si les DEUX chaines à concaténer sont terminées par '\0'. Ce n'est pas le cas de ID.
    Place le caractère explicitement
    ID[3] = '\0';

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sergedarkmaul Voir le message
    Bonjour, je vous écris car je rencontre actuellement d’important problème concernant mon projet de langage C
    Mon problème porte sur la lecture des tags ID3 dans un fichier mp3.
    Le TAG d’un fichier mp3 ID3 est composé de la sorte : (ceci est un exmple…)
    <...>

    Merci pour vos réponses et vos aides.

    http://delahaye.emmanuel.free.fr/projets/playlist/

Discussions similaires

  1. Problèmes avec Fread et Fwrite
    Par Sotoaleono dans le forum C
    Réponses: 1
    Dernier message: 17/02/2015, 10h00
  2. Problème avec fread() ?
    Par AYDIWALID dans le forum OpenCV
    Réponses: 0
    Dernier message: 03/01/2011, 06h08
  3. probléme avec fread et/ou fseek
    Par doumo dans le forum MATLAB
    Réponses: 16
    Dernier message: 22/12/2008, 17h15
  4. problème lecture avec fread
    Par xeron33 dans le forum C
    Réponses: 1
    Dernier message: 18/06/2008, 23h04
  5. petit problème avec fread
    Par Myth_Titans dans le forum C++
    Réponses: 2
    Dernier message: 07/02/2006, 08h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo