Re: [問題] 讀id3v1 tag用fread和fgetc的差異?

看板C_and_CPP作者 (雷佔那特)時間13年前 (2010/12/19 16:34), 編輯推噓2(2011)
留言13則, 4人參與, 最新討論串2/2 (看更多)
: 餵入的資料(Input): : .mp3 : 預期的正確結果(Expected Output): : TAG : 錯誤結果(Wrong Output): : TAGB ? : #define TAG_SIZE 3 : typedef struct { : char tag[TAG_SIZE]; : char title[TITLE_SIZE]; : char artist[ARTIST_SIZE]; : char album[ALBUM_SIZE]; : char year[YEAR_SIZE]; : char comment[COMMENT_SIZE]; : char zero; : char track; : char genre; : } MP3_TAG; : int main(int argc, char *argv[]) : { : int i = 0; : MP3_TAG mp3_tag; : char *file_path; : FILE *fin; : file_path = "c:/Bounce.mp3"; : fin = fopen(file_path,"rb"); : if(fin == NULL) : { : printf("file doesn't exist!!\n"); : } : fseek(fin,-MP3_TAG_SIZE,SEEK_END); : fread(&mp3_tag.tag,1,sizeof(TAG_SIZE),fin); : printf("MP3_TAG= %s\n", mp3_tag.tag); : system("PAUSE"); : return 0; : } : 以上code會印出 TAGB ? : 但 fread 那行如果換成 : while(i<TAG_SIZE) : { : mp3_tag.tag[i] = fgetc(fin); : i++; : } : 則會正確顯示TAG : fread不是一次讀一個byte? : 有試過用ftell印出fin的位址是正確的,但讀出來就是有多餘的字元? 何解@@ : 想很久無法解決印出多餘字元的問題.. 沒寫過mp3相關的program, 不過要不要試試 memset(&mp3_tag,0,sizeof(MP3_TAG)); 跟 mp3_tag.tag[TAG_SIZE]='\0'; 看看 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.250.104

12/19 16:41, , 1F
好的,這樣用法好像有看過..來試一下.thxs
12/19 16:41, 1F

12/19 16:42, , 2F
mp3_tag.tag[TAG_SIZE]='\0'; 根本就超界了
12/19 16:42, 2F

12/19 17:29, , 3F
得到解答了 fread那行必須改成 sizeof(mp3_tag.tag)
12/19 17:29, 3F

12/19 17:29, , 4F
因為sizeof(TAG_SIZE)=4 sizeof(mp3_tag.tag)=3 = =
12/19 17:29, 4F

12/19 17:30, , 5F
看來不能使用對#define的變數(?)取sizeof
12/19 17:30, 5F

12/19 17:42, , 6F
那是整數符號 3, 預設用long int來存
12/19 17:42, 6F

12/19 17:43, , 7F
因為他取代掉會變成 sizeof(3) 被當成整數 所以是 4 byte
12/19 17:43, 7F

12/19 17:43, , 8F
整數預設是 int 吧?
12/19 17:43, 8F

12/19 17:44, , 9F
感謝樓上二位的解答...原來是變成sizeof(int),所以是4
12/19 17:44, 9F

12/19 17:48, , 10F
嗯嗯 記錯了XD
12/19 17:48, 10F

12/19 17:51, , 11F
呃,其實 sizeof 一直是多的吧?TAG_SIZE 本身不就是
12/19 17:51, 11F

12/19 17:51, , 12F
size 的資訊嗎?對它取 sizeof 是要 ... ?
12/19 17:51, 12F

12/19 17:52, , 13F
也對 這樣用有點怪怪,有脫褲子放屁的意謂....= =
12/19 17:52, 13F
文章代碼(AID): #1D3SE0XN (C_and_CPP)
文章代碼(AID): #1D3SE0XN (C_and_CPP)