2013-10-16 125 views
5

我懷疑fread/fwrite的參數大小和計數的順序。如果我想從文件fp中讀取8kb的數據,以下哪一項更高效?fread/fwrite的大小和數量

fread(data,1,8192,fp) 
fread(data,8192,1,fp) 

也有endiannes問題,我應該擔心?

回答

11

它們完全相同。至於字節順序,這取決於你正在閱讀的內容。通常情況下,它將是一個字節緩衝區,根據它們寫入的格式,您必須「不格式化」。由於它是字節,字節序不起作用。

編輯:

由於simonc指出,(然後將其刪除,因爲他沒有得到它100%正確的---但他的觀點是有效的):有是關於返回值(差別你需要使用它來知道函數是否工作)。 fread(buffer, 8192, 1, fp)將返回0或1,只有當所有8192個字節被讀取時才返回1。另外,Posix說緩衝區的內容沒有爲部分讀取的對象指定。在實踐中,緩衝區將被填充儘可能多的字節,但由於您不知道有多少字節,這並不會給您帶來太多的收益。總之,你應該總是使用fread(buffer, 1, 8192, fp);(因爲除了字節緩衝區以外的任何東西都沒有意義)。

+0

好吧,由於它是字節,明顯的字節順序會起一定的作用。想象一下,他正試圖將這8kb數據讀入一個具有「int」成員的結構中。你假設他正在嘗試做類似'char string [] = fread(data,8192,1,fp);' – fvdalcin

+3

@fvdalcin他正在讀字節。字節沒有字節序。一旦他閱讀了他們,他必須根據文件格式的規範來解釋它們。這通常應該在沒有考慮排序的情況下完成。 –

+0

@fvdalcin是的,這些函數唯一合理的用法是'unsigned char buffer [8192]; fread(buffer,8192,1,fp);'。之後,您必須根據指定的文件格式來解釋緩衝區。 –

2

它們不完全相同。

fread()是錯誤設計的。它的設計忽略了在文件末尾進行部分讀取的可能性,不能用它的返回值來表示,它的大小以您指定的大小爲單位。

您應該只使用fread(),其中大小爲1,長度爲您期望的字節數。這是你正確處理這種情況的唯一方法。對於char以外的其他類型,表示提供sizeof char作爲長度,n*sizeof T作爲長度,其中n是您期望的T的數量。