如果你正在寫從檔案或網路讀寫資料的跨平台c/c++**,那麼你必須明白有些問題是因語言,編譯器,平台而不同的。主要的問題是資料對齊,填充,型別大小,位元組順序和預設狀態char是否有符號。在c/c++中, 內建型別的大小完全取決於編譯器(在特定範圍內). 不要讀寫大小不明確的資料型別。
c/c++ 跨平台i/o操作技巧
如果你正在寫從檔案或網路讀寫資料的跨平台c/c++**,那麼你必須明白有些問題是因語言,編譯器,平台而不同的。 主要的問題是資料對齊,填充,型別大小,位元組順序和預設狀態char是否有符號。
對齊特定機器上,特定的資料被對齊於特定的邊界。如果資料沒有正確對齊,結果可能是效率降低甚至崩潰。 當你從i/o源讀取資料的時候,確保對齊是正確的。
填充"填充" 是資料集合中不同元素之間的間隔, 一般是為了對齊而存在。不同編譯器和平台下,填充的數量可能會不同。?不要假設結構的大小和成員的位置在任何編譯器和平台下都是相同的。 不要一次性讀取或者寫入一整個結構體,因為寫入的程式可能會使用和讀取的程式不同的填充方式。對於域也同樣適用。
型別大小
不同資料型別的大小隨編譯器和平台而不同。 在c/c++中, 內建型別的大小完全取決於編譯器(在特定範圍內). 不要讀寫大小不明確的資料型別。也就是說,不要讀寫bool, enum, long, int, short, float, 或者double型別.(譯者注:事實似乎不是這樣,我記得c/c++標準規定了一些資料型別的長度,例如short 2位元組,long 4位元組等等,在符合標準規定的編譯器上,使用這些型別可以保證跨平台的正確性)
用這些 替代這些...
int8, uint8 char, signed char, unsigned char, enum, bool
int16, uint16 short, signed short, unsigned short, enum
int32, uint32 int, signed int, unsigned int, long, signed long, unsigned long, enum
int64, uint64 long, signed long, unsigned long
int128, uint128 long long, signed long long, unsigned long long
float32 float
float64 double
位元組順序
位元組順序,就是位元組在記憶體中儲存的順序。 不同的處理器儲存多位元組資料的順序是不同的。 小端處理器由低到高儲存(換句話說,和書寫的順序相反).。大端處理器由高到低儲存(和書寫順序相同)。如果數值的位元組順序和讀寫它的處理器不同,它必須被事先轉化。同時,為了標準化網路傳輸的位元組順序,定義了網路位元組順序。
char - 有符號還是無符號?
乙個鮮為人知的事實,char預設可以是有符號的也可以是無符號的-完全取決於編譯器。結果導致你從char轉化為其他型別的時候(比如int),結果會因編譯器而不同。 例如:
char x;
int y;
read( fd, &x, 1 ); // 讀取乙個byte值為0xff
y = x; // y 是 255 或者 -1, 依賴編譯器
不要把資料讀入一般的char。明確指定是有符號或者無符號的
C C 位操作技巧
檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...
C C 跨平台INI檔案讀寫API
已測試通過的開發環境 winxp vista vc6.0 vs2003 vs2005 vs2008 fc6.0 fc7.0 ubuntu7.10 gcc4.1 arm linux arm linux gcc3.3.2 專案特點 1.使用標準c庫函式,支援windows linux unix等多平台。...
C C 檔案I O操作緩衝檔案操作
緩衝區是為程式分配的記憶體塊,在進行資料量比較大且不要求實時性的 i o 操作時,一部分資料被置於緩衝區中,只有當資料的長度快要超過緩衝區範圍或時間週期達到時,這些資料才被送入指定的位置。基於緩衝區的檔案 i o 操作減少了對裝置的物理資料介面 訪問次數,從而使大量資料的 i o 操作的系統開支減少...