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

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 6
    Points
    6
    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 émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    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?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 6
    Points
    6
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  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
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 6
    Points
    6
    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
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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';
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    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;
    }

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Coucou tous le monde, je vous remercie de votre aide, j'ai demandé de l'aide à un ami qui m'a resolu en partie mon probleme. Pour ceux que ca interresse je vous montre le code : Bon c'est clair que c'est pas fini mais au moins ca avance à petit pas...Après je metterai les conditions sur les autres version versions mais pour le moment je travaillais sur la version V2.3 Voilà. une fois le principe compris c'est plus facile à reproduire...


    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
     
    // Extraction TAG des MP3
    void Extraction(struct TAG *ptr_tag,const char *nomfichier)
    {
     
      FILE *ptr_fichier;
     
      char poubelle[255];
      char LONGUEUR[4]="\0";
      char ID[4]="\0";
      char TITRE[5]="\0";
      int  hex;
      int  taille=0;
     
      char titrecomplet[50]="\0";
      char artistecomplet[50]="\0";
      char albumcomplet[50]="\0";
     
      // 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);
       printf("ID : %s \n",ID);
     
       // on passe la version, le flag et la taille du tag pour le moment
       fread(poubelle,sizeof(char),6,ptr_fichier);
     
       taille = getc(ptr_fichier);
       // Affichage de la taille du titre
       printf("Taille du TAG : %d \n",taille);
     
     
       // Lecture de 4 caractères du fichier mp3 : TIT2
       fread(TITRE,sizeof(char),4,ptr_fichier);
       printf("TITRE : %s \n",TITRE);
     
       // on passe le flag
       fread(poubelle,sizeof(char),3,ptr_fichier);
     
       // lecture de la taille du titre sur 2 caractères en hexa.
       taille = getc(ptr_fichier);
       // Affichage de la taille du titre
       printf("Taille du titre : %d \n",taille);
     
       // On passe le flag
       fread(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); 
     
     
     
      }         
     
       strcpy(ptr_tag->titre,titrecomplet);
       strcpy(ptr_tag->artiste,artistecomplet);
       strcpy(ptr_tag->album,albumcomplet);
     
     fclose(ptr_fichier);
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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/
    Pas de Wi-Fi à la maison : CPL

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