Domanda

Sto cercando di leggere l'intestazione di ID3v2 dei file MP3. Posso ottenere/stampare ID3 e voglio stampare "versione" e "sovversione" che è tipo char, ma non riesco a ottenere ciò di cui ho bisogno.

Ecco il codice:

    }
    .....
    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.

È stato utile?

Soluzione

Dovresti leggere solo una volta l'intestazione. cioè se hai

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

Il tuo codice sarebbe:

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);
}

Notare che version e subversion sono numeri interi delle dimensioni di byte, non caratteri stampabili, quindi dovresti usare %hhu (%hhd Se sono firmati) come specifica del formato.

Inoltre, il puntatore al primo elemento di una struttura e il puntatore a una struttura confronta uguali, quindi cambiando il tuo fread linea a:

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

non è necessario (difficile mostrerebbe l'intento molto più chiaramente).

Altri suggerimenti

Stai leggendo abbastanza byte? Stai passando l'indirizzo di tag.tag, ma fornendo dimensione di (tag) e non sizeof (tag.tag).

Sarebbe %c per stampare un carattere e no %s (utilizzato per la stampa di terminazione null char*):

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

Uso %d Se vuoi vedere il byte come un numero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top