2011-05-29 122 views
4

一個目的foo被寫入一個新文件在平臺1爲:C++平臺兼容性

write(file, &myFoo, sizeof(struct foo)); 

...,然後用在平臺2​​讀:

read(file, &myFoo, filesize(file)); 

foo該對象具有定義如下:

struct foo 
{ 
    char a; 
    int b; 
    long c; 
    char* d; 
}; 

加載時可能會出現什麼樣的問題平臺2上的?

+3

這聽起來很像功課... – grapefrukt 2011-05-29 21:32:35

+0

由於您沒有從'write'返回測試錯誤,所以'Foo'可能沒有被正確寫出。還有很多其他問題已經在SO上被解決了很多次。 – 2011-05-29 21:36:01

+0

這是不是我的工作面試考試,我覺得我完全被轟炸了!我只是想通過所有的問題,並找出我做錯了什麼!抱歉! – 2011-05-29 21:50:49

回答

8

當你做到這一點,你需要注意:

  • 數據類型的大小(char是可以信任的唯一一個)
  • 對齊/填充
  • 字節序
  • 指着無效內存
  • 浮點數表示法
  • ASCII vs EBCDIC? (是啊,真的嗎?)
  • 可能其他
+3

「字符是唯一可以信任的字符」 - 而且這不是一種有用的方式。'sizeof(char)'爲1,但如果平臺1上的CHAR_BIT爲16,平臺2上的CHAR_BIT爲8,那麼當文件從一個系統傳輸到另一個系統時,必須提供一些信息。實際上,16位字符系統可能沒有文件系統,而9位系統是古老的沒有人關心的,但是原則上你甚至不能相信'char'... – 2011-05-29 22:05:08

12

各種問題!

我們不知道char,int,longchar*在不同平臺上的尺寸是否相同。

發生了什麼事d指出?

成員之間也可能有填充,這可能會在平臺之間有所不同。大端和小端系統會按不同的順序存儲整數和指針的字節。如果你真的不走運,也可能會有一箇中端系統。

+0

謝謝,我現在明白了... – 2011-05-29 21:52:30

+4

他接受了這個,沒有問中間碼?害怕。 – 2011-05-29 22:15:38

+1

與其他人笑,而不是他們。這非常接近被標記。真的有什麼需要居高臨下的嗎?你給答案增加了什麼價值。 – mattnz 2011-05-30 04:43:01

0

我認爲,你必須使用包編譯,以確保沒有填充。 否則char的大小將有4個字節,具體取決於默認的填充方法。

char *該地址指針在32位機器上可以有32位,但在64位機器上可以有64位。 所以直接存儲指針是無稽之談。

最後一個是endian。