0

mp3ファイルのID3V2のヘッダーを読み込もうとしています。ID3を取得/印刷でき、char型である「version」と「subversion」を印刷したいのですが、必要なものが取得できません。

ここにコードがあります:

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

A。

4

3 に答える 3

0

十分なバイトを読んでいますか?tag.TAGのアドレスを渡していますが、sizeof(tag.TAG)ではなくsizeof(tag)を指定しています。

于 2011-06-16T18:53:23.617 に答える
0

これは%c、charを印刷するためのものであり、 %s(nullで終了するものを印刷するために使用されるchar*)ものではありません。

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

%dバイトを数値として表示する場合に使用します。

于 2011-06-16T18:53:36.393 に答える
0

ヘッダーは一度だけ読んでください。つまり、あなたが持っている場合

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

コードは次のようになります。

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

versionおよびsubversionはバイトサイズの整数であり、印刷可能な文字ではないため、フォーマット仕様として%hhu(署名されている場合)を使用する必要があることに注意してください。%hhd

また、構造体の最初の要素へのポインターと構造体へのポインターは等しいので、fread行を次のように変更します。

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

不要です(ただし、意図がより明確に示されます)。

于 2011-06-16T20:44:18.327 に答える