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

看板C_and_CPP作者 (黑金屬魂)時間13年前 (2010/12/19 16:21), 編輯推噓0(004)
留言4則, 2人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, Gcc, Linux, ...) dev c++ 問題(Question): 顯示多餘的字元 餵入的資料(Input): .mp3 預期的正確結果(Expected Output): TAG 錯誤結果(Wrong Output): TAGB ? 程式碼(Code): (請善用置底文標色功能) #include <stdio.h> #include <stdlib.h> #define MP3_TAG_SIZE 128 #define TAG_SIZE 3 #define TITLE_SIZE 30 #define ARTIST_SIZE 30 #define ALBUM_SIZE 30 #define YEAR_SIZE 4 #define COMMENT_SIZE 28 #define ZERO_BYTE 1 #define TRACK_SIZE 1 #define GENRE_SIZE 1 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的位址是正確的,但讀出來就是有多餘的字元? 何解@@ 想很久無法解決印出多餘字元的問題.. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.190.217

12/19 22:25, , 1F
用 %s 只能印 zero-terminated 的字串
12/19 22:25, 1F

12/20 20:27, , 2F
的確是這個問題..改成char tag[TAG_SIZE]就正常了,書上有
12/20 20:27, 2F

12/20 20:27, , 3F
寫到..thxs
12/20 20:27, 3F

12/20 20:28, , 4F
char *tag[TAG_SIZE]
12/20 20:28, 4F
文章代碼(AID): #1D3S1uFD (C_and_CPP)
文章代碼(AID): #1D3S1uFD (C_and_CPP)