문제
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);
}
}
ㅏ.
해결책
헤더는 한 번만 읽어야 합니다.즉.당신이 가지고 있다면
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
불필요합니다(의도를 훨씬 더 명확하게 표시하기는 어렵습니다).
다른 팁
충분한 바이트를 읽고 있습니까?tag.TAG의 주소를 전달하지만 sizeof (tag.TAG)가 아닌 sizeof (tag)를 제공합니다.
이것은 %c
가 아닌 char를 인쇄하기위한 %s
입니다 (null로 끝나는 char*
를 인쇄하는 데 사용됨) :
라코 디스
바이트를 숫자로 보려면 %d
를 사용하세요.
제휴하지 않습니다 StackOverflow