2012-07-27 96 views
3

fwrite是否便攜?我並不是真的面對下面描述的問題,但我想了解C的基本原理。我們假設我們有兩臺機器A8(字節= 8位)和B16(字節= 16位)。fwrite可移植性

下面的代碼會在兩臺機器上產生相同的輸出嗎?我猜A8會產生80位(10個八位位組),而B16會產生160位(20個八位位組)。 我錯了嗎?

如果僅使用uintN_t類型及其在比特長度是獨立於字節的大小將不會出現此問題。但是也許uint8_t在B16上不存在。

這個問題的解決方案是什麼?

我猜建設uint32_t的數組,把該數組在我的字節(帶智能班次,並根據機器的體系口罩),寫這個數組就能解決問題。但是這並不令人滿意。再次假設uint32_t在所有平臺上都存在。填充此數組將非常依賴於當前機器的體系結構。

感謝您的回覆。

+0

「但是也許uint8_t在B16上不存在。」它不能,除了位字段可以比字符小的字符以外沒有其他字符。 – 2012-07-27 09:40:16

+0

'sizeof(char)'是** always ** 1. – 2012-07-27 09:45:06

+0

「我猜A8會產生80個八位字節,而B16會產生160個八位字節,我錯了嗎?是的,它將是80人。160 **位**或10個。 20 **八位組**。 – 2012-07-27 09:54:24

回答

0

一個字節幾乎在每臺現代計算機上都有8位。但還有一個原因是fwrite不可移植:
在Little Endian機器上寫入的文件不能由大型機器和其他方式驅動。

+0

這是錯誤的,在C中,一個字節總是'CHAR_BIT'位。你唯一的保證是它至少_8。 – 2012-07-27 09:55:24

+0

感謝您的評論!現在答案應該是正確的。 – qwertz 2012-07-27 10:01:16

+0

這隻適用於跨越多個存儲單元的類型,例如16-/32-/64位整數類型或浮點數。字符數組(基本上是字符串)總是在BE和LE機器上以同樣的方式佈置在內存和磁盤上。 – 2012-07-27 10:50:04

0

在C中,char被定義爲「機器的最小可尋址單位」。也就是說,char不一定是8位。

在大多數情況下,它是足夠安全依賴於一個事實,即char是8位,而不是處理一些極端的情況下。

一般講,你可能不會能夠「一個字節的一半」寫上存儲的文件。此外,在設計用於不同字節大小機器的設備之間,硬件級別上的可移植性也會存在問題。如果您正在處理其他設備(如電信或其他設備),則必須實施比特流。

2

fwrite()是一個標準庫函數。所以它對於每個C編譯器都必須是可移植的。 這就是它必須在該編譯器的C標準庫中定義以支持您的機器。

因此8bit,16bit,32bit的機器給你同樣的高級操作。

但是,如果你想設計的庫函數,那麼你必須考慮機器架構,這臺機器的內存組織。

作爲一個C編譯器用戶,您不應該擔心內部行爲。

我想你只是想使用那些C庫函數。因此,不同機器的功能行爲沒有區別。