誤用fwrite函式的坑

2021-10-09 22:32:05 字數 2253 閱讀 5611

參考:

fwrite寫入檔案大小錯誤的問題_mingcz的專欄-csdn部落格

c 庫函式 – fopen() | 菜鳥教程

症狀:fwrite出來的影象有奇怪的錯位。176x144的小圖沒問題,但像下面416x240的圖就有問題了。如果把畫素值列印出來,複製到excel,再匯入matlab裡imshow(uint8(img))顯示影象,會發現影象是正常的。

把影象列印出來匯入matlab顯示:

原來是w+wb的區別,ww+預設是以文字模式寫入,當遇到換行符0a0d時會根據系統不同對換行符進行修改,對於這裡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 要...