今天在寫資源管理器的時候,載入音訊檔案,發現檔案頭的格式對不上,剛開始以為是讀頭的邏輯出錯了,在vs下用debug的memory和用hex格式對比發現,最終是發現記憶體沒有載入全只是載入了一部分的原因,是讀到了0x1a
google了一下,發現自己開啟檔案的方式不對,我使用的是:
1
file
* file =
fopen
( path,
"r"
);
而正確的應該是:
1
file
* file =
fopen
( path,
"rb"
);
為什麼是這樣子呢,因為如果用"r"模式開啟,字元是有意義的,只要是讀到0x1a時,fread就認為是結束。為什麼是0x1a,而不是別的,寫個小例子輸出一下ctrl + z的ascii碼值發現,它的ascii碼值就是26在windows上(linux是掛起任務)。
但你以"rb"讀到文字,系統io只會認為它是文字而非別的東西。
推薦乙個hex檢視器,當資源和記憶體資料不符的時候,hex格式的檢視顯得比較重要了。notepad++的乙個外掛程式,hex editor.
reference:
1.2.
fread和 fgets的區別
fread 和fgets 的區別 fread 以位元組位計算長度 按照指定的長度和次數讀取資料 遇到結尾或完成指定長度讀取後停止 fgets 整行讀取 遇到回車換行或結尾停止 在文字方式時使用.讀字串函式 fgets 函式的功能是從指定的檔案中讀乙個字串到字元陣列中,函式呼叫的形式為 fgets 字...
fread和flushall的問題
今天測試寫過的一段程式,比較頻繁的出現乙個fread錯誤 貼 int sendchannelinfo socket obj sock else if postsend sock,sendbuf no error return 0 錯誤描述 讀檔案的時候,fopen正常,得到正確的檔案指標,之後的若干...
read與fread的區別
與 fread 的區別的誤解 rel noopener noreferrer read 與 fread 的區別的誤解 刻卜浪興 前多時間梳理了一些linux上的程式設計,其實就是認識的大量的系統呼叫 posix 這裡有乙個我們經常提出的問題就是fread,read的區別。當然這兩個分別代表了操作檔案...