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]
  • 型態大小不同: 不同系統的 intlong 等大小可能不同
  • 浮點數格式: 可能使用不同的表示法