看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
james732:mp3為什麼要用strlen計算長度? 01/02 11:20
deh3215:實際的程式,長度是以mp3tag大小取代,就是0~tagsize的範圍 01/02 11:22
deh3215:來比對字元,要比對出frame名稱的位置再處理 01/02 11:22
deh3215:目前是用迴圈+if(tit2_temp[i] =='T')的方式比對,想縮短co 01/02 11:24
deh3215:de... 01/02 11:24
james732:可以用置底文的連結 補充你目前正常運作的版本嗎? 01/02 11:27
deh3215:是讀取mp3的code嗎 01/02 11:29
deh3215:不太清楚你的意思,直接附上,讀擋路徑改一下即可執行 01/02 13:33
deh3215:0rz.tw/5w39G 01/02 13:33
Bencrie:因為mp3是 binary file ... 你用 strlen 它只要遇到\0就 01/02 14:52
Bencrie:會把前面的東西當成字串。 01/02 14:52
Bencrie:你的 mp3 strlen回傳4,表示你的mp3檔第五個 char是 0 01/02 14:53
Bencrie:你用一個int去接 fread的回傳值不是比較快嗎 XD 01/02 14:55
deh3215:的確,支援id3v2.3的mp3檔第五個byte為00(附版本),fread可 01/02 15:14
deh3215:以這樣用嗎? 來試試看,thanks 01/02 15:14
deh3215:的確是可以,不過strstr(tit2_temp,"TIT2")這個取sizeof 01/02 15:50
deh3215:或strlen都沒辦法獲得想要的值 01/02 15:50
Bencrie:如果你要比較 binary data 就不要用 string function去比 01/02 16:01
deh3215:所以只能用土法煉鋼自己寫了? 01/02 16:05