參考:
fwrite寫入檔案大小錯誤的問題_mingcz的專欄-csdn部落格
c 庫函式 – fopen() | 菜鳥教程
症狀:fwrite出來的影象有奇怪的錯位。176x144的小圖沒問題,但像下面416x240的圖就有問題了。如果把畫素值列印出來,複製到excel,再匯入matlab裡imshow(uint8(img))
顯示影象,會發現影象是正常的。
把影象列印出來匯入matlab顯示:
原來是w+
與wb
的區別,w
w+
預設是以文字模式寫入,當遇到換行符0a
0d
時會根據系統不同對換行符進行修改,對於這裡windows就是加乙個符號,導致資料變多,影象往右偏了。對於寫入影象應該用wb
以二進位制形式寫入。
這是當時fwrite的**:
file *out;
//fopen_s(&out, "c:/users/vid/documents/working/vvcsoftware_vtm-vtm-10.0/bin/imok.yuv", "w+");//這樣寫是錯的,坑了一天……
fopen_s
(&out,
"c:/users/vid/documents/working/vvcsoftware_vtm-vtm-10.0/bin/imok.yuv"
,"wb");
if(out ==
nullptr
)else
ascii
縮寫含義
0alf
換行鍵0d
cr歸位鍵
ascii編碼對照表_911查詢
windows 《回車換行》 (carriage return and line feed) 「\r\n」 crlf
unix系統 《換行》 (carriage return) 「\n」 cr
unix: linux和macos
很久以前的macos的換行符是lf
下面這個教程裡說的也很清楚:
第十一章 檔案和流 · python 精要教程
'b'
模式改變處理檔案的方法。一般來說,python假定處理的是文字檔案(包含字元)。通常這樣做不會有任何問題。但是如果處理的是一些其他型別的檔案(二進位制檔案),比如聲音剪輯或者影象,那麼應該在模式中增加'b'
。引數'rb'
可以用來讀取乙個二進位制檔案。為什麼使用二進位制模式
如果使用二進位制模式來讀取(寫入)檔案的話,與使用文字模式不會有很大區別。仍然能讀一定數量的位元組(基本上和字元一樣),並且能執行和文字檔案有關的操作。關鍵是,在使用二進位制模式時,python會原樣給出檔案中的內容——在文字模式下則不一定。
python對於文字檔案的操作方式令人有些驚訝,但不必擔心。其中唯一要用到的技巧就是標準化換行符。一般來說,在python中,換行符(
\n
)表示結束一行並另起一行,這也是unix系統中的規範。但在windows中一行結束的標誌是\r\n
。為了在程式中隱藏這些區別(這樣的程式就能跨平台執行),python在這裡做了一些自動轉換:當在windows下用文字模式讀取檔案中的文字時,python將\r\n
轉換成\n
。相反地,當在windows下用文字模式向檔案寫文字時,python會把\n
轉換成\r\n
(macintosh系統上的處理也是如此,只是轉換是在\r
和\n
之間進行)。在使用二進位制檔案(比如聲音剪輯)時可能會產生問題,因為檔案中可能包含能被解釋成前面提及的換行符的字元,而使用文字模式,python能自動轉換。但是這樣會破壞二進位制資料。因此為了避免這樣的事發生,要使用二進位制模式,這樣就不會發生轉換了。
需要注意的是,在unix這種以換行符為標準行結束標誌的平台上,這個區別不是很重要,因為不會發生任何轉換。
注:通過在模式引數中使用u引數能夠在開啟檔案時使用通用的換行符支援模式,在這種模式下,所有的換行符/字串(
\r\n
、\r
或者是\n
)都被轉換成\n
,而不用考慮執行的平台。
fread函式 fwrite函式
1.fread函式 函式原型 size t fread void buffer size t size size t count file stream 功 能 從乙個檔案流中讀資料,讀取count 個元素,每個元素 size 位元組.如果呼叫成功返回 count.如果呼叫成功則實際讀取 size ...
fread函式和fwrite函式
1.函式功能 用來讀寫乙個資料塊。2.一般呼叫形式 fread buffer,size,count,fp fwrite buffer,size,count,fp 3.說明 1 buffer 是乙個指標,對fread來說,它是讀入資料的存放位址。對fwrite來說,是要輸出資料的位址。2 size 要...
fread函式和fwrite函式
1.函式功能 用來讀寫乙個資料塊。2.一般呼叫形式 fread buffer,size,count,fp fwrite buffer,size,count,fp 3.說明 1 buffer 是乙個指標,對fread來說,它是讀入資料的存放位址。對fwrite來說,是要輸出資料的位址。2 size 要...