fread, fwrite
Function Prototype
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);Function
和 write 很像
Parameters
ptr: 指定資料應該存在哪裡size: 要讀或存的一個物件大小有多大,像是如果我們用 struct 那這格就會是sizeof(struct)nobj: 我們要讀入幾個size中指定的物件
Remark
Statement
Programs using fread or fwrite isn’t portable across systems.
Reason
Alignment不同
- 不同編譯器/系統會在結構體中插入不同的 padding
- 導致成員的 offset 位置不一致
For example:
struct Example {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
};- 32 位元系統:
[a][pad×3][b×4][c][pad×3]→ 總共 12 bytes - 某些 64 位元系統: 可能對齊到 16 bytes
- 不同編譯器: padding 位置和大小可能不同
資料型態的二進位表示不同
- 位元組順序(Endianness): Big-endian vs Little-endian
- 例:
0x12345678在 big-endian 存為[12][34][56][78] - 在 little-endian 存為
[78][56][34][12]
- 例:
- 型態大小不同: 不同系統的
int、long等大小可能不同 - 浮點數格式: 可能使用不同的表示法