Question

J'essaie de lire l'en-tête de ID3v2 de fichiers MP3. Je peux obtenir / imprimer ID3 et vouloir imprimer "version" et "subversion" qui est de type char, mais je ne peux pas obtenir ce dont j'ai besoin.

Voici le code:

    }
    .....
    fseek(file,0,SEEK_SET); 
    fread(&tag.TAG, 1, sizeof(tag),file); // tag is structure with elements of header

    if(strncmp(tag.TAG,"ID3", 3) == 0)
    {
        fread(&tag.version,1, sizeof(tag),file);
        fread(&tag.subversion,1, sizeof(tag),file);

    printf("ID3v2.%s.%s", tag.version, tag.subversion);
   }
}

UN.

Était-ce utile?

La solution

Vous ne devriez lire qu'une seule fois l'en-tête. c'est-à-dire si tu as

struct id3v2hdr {
    char TAG[3];
    unsigned char version;
    unsigned char subversion;
    ...
}

Votre code serait:

fseek(file,0,SEEK_SET); 
fread(&tag.TAG, 1, sizeof(tag),file); // tag is structure with elements of header

if(strncmp(tag.TAG,"ID3", 3) == 0)
{
    printf("ID3v2.%hhd.%hhd", tag.version, tag.subversion);
}

Notez que version et subversion sont des entiers de la taille d'un octet, pas des caractères imprimables, vous devez donc utiliser %hhu (%hhd s'ils sont signés) comme spécification de format.

De plus, le pointeur vers le premier élément d'une structure, et le pointeur vers une structure se comparent égaux, donc en modifiant votre fread ligne à:

fread(&tag, 1, sizeof(tag),file); // tag is structure with elements of header

est inutile (difficile, cela montrerait l'intention beaucoup plus clairement).

Autres conseils

Lisez-vous suffisamment d'octets? Vous passez l'adresse de Tag.tag, mais fournissant la taille de la taille (TAG) et non la taille (tag.tag).

Ce serait %c pour imprimer un char et non %s (Utilisé pour l'impression char*):

printf("ID3v2.%c.%c", tag.version, tag.subversion);

Utilisation %d Si vous voulez voir l'octet comme un numéro.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top