[問題] 讀.txt和.mp3的差異?

看板C_and_CPP (C/C++)作者 (黑金屬魂)時間15年前 (2011/01/02 11:09), 編輯推噓2(2017)
留言19則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, Gcc, Linux, ...) linux 問題(Question): 讀.txt沒問題,讀.mp3有問題 餵入的資料(Input): .txt/.mp3 程式碼(Code): (請善用置底文標色功能) char *tit2_temp; char *temp="TIT2"; int main(int argc, char *argv[]) { FILE *f; f = fopen("/home/deh3215/文件/mp3/1.txt","r"); tit2_temp = malloc(sizeof(char)*8517027); fread(tit2_temp, 1, 8517027,f); printf("strlen(tit2_temp) = %d\n",strlen(tit2_temp)); printf("strlen(TIT2) = %d\n", strlen(temp)); printf("pos = %d\n",strlen(tit2_temp)-strlen(strstr(tit2_temp,temp) return 0; } 補充說明(Supplement): 以上code可正常執行.但改成.mp3,就會"記憶體區段錯誤" 1.txt有30個字元,strlen會顯示30,改成讀.mp3,strlen會顯示4,為何?? 程式目的想開檔,然後比對檔案某字元再處理,希望可以用strlen+strstr來處理 而非用迴圈,一個字元一個字元比對... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.146.137

01/02 11:20, , 1F
mp3為什麼要用strlen計算長度?
01/02 11:20, 1F

01/02 11:22, , 2F
實際的程式,長度是以mp3tag大小取代,就是0~tagsize的範圍
01/02 11:22, 2F

01/02 11:22, , 3F
來比對字元,要比對出frame名稱的位置再處理
01/02 11:22, 3F

01/02 11:24, , 4F
目前是用迴圈+if(tit2_temp[i] =='T')的方式比對,想縮短co
01/02 11:24, 4F

01/02 11:24, , 5F
de...
01/02 11:24, 5F

01/02 11:27, , 6F
可以用置底文的連結 補充你目前正常運作的版本嗎?
01/02 11:27, 6F

01/02 11:29, , 7F
是讀取mp3的code嗎
01/02 11:29, 7F

01/02 13:33, , 8F
不太清楚你的意思,直接附上,讀擋路徑改一下即可執行
01/02 13:33, 8F

01/02 13:33, , 9F
0rz.tw/5w39G
01/02 13:33, 9F

01/02 14:52, , 10F
因為mp3是 binary file ... 你用 strlen 它只要遇到\0就
01/02 14:52, 10F

01/02 14:52, , 11F
會把前面的東西當成字串。
01/02 14:52, 11F

01/02 14:53, , 12F
你的 mp3 strlen回傳4,表示你的mp3檔第五個 char是 0
01/02 14:53, 12F

01/02 14:55, , 13F
你用一個int去接 fread的回傳值不是比較快嗎 XD
01/02 14:55, 13F

01/02 15:14, , 14F
的確,支援id3v2.3的mp3檔第五個byte為00(附版本),fread可
01/02 15:14, 14F

01/02 15:14, , 15F
以這樣用嗎? 來試試看,thanks
01/02 15:14, 15F

01/02 15:50, , 16F
的確是可以,不過strstr(tit2_temp,"TIT2")這個取sizeof
01/02 15:50, 16F

01/02 15:50, , 17F
或strlen都沒辦法獲得想要的值
01/02 15:50, 17F

01/02 16:01, , 18F
如果你要比較 binary data 就不要用 string function去比
01/02 16:01, 18F

01/02 16:05, , 19F
所以只能用土法煉鋼自己寫了?
01/02 16:05, 19F
文章代碼(AID): #1D7-n__R (C_and_CPP)
文章代碼(AID): #1D7-n__R (C_and_CPP)