代碼以 `"ab+"` (二進制追加讀寫) 打開文件寫入,但**讀取時未指定二進制模式** 或文件指針位置錯誤導致讀寫脫節。Windows 文本模式會轉換 `\n`↔`\r\n`,破壞結構體二進制佈局。
// 寫入
FILE *bookFile = fopen("book", "wb"); // "wb" 覆蓋寫入 / "ab" 追加
// ... fwrite(&book, BOOK_SIZE, 1, bookFile);
fclose(bookFile);
// 讀取
FILE *p = fopen("book", "rb"); // 必須 "rb"
while (fread(&book, BOOK_SIZE, 1, p) == 1) {
// 處理 book
}
fclose(p);
class BinFile {
FILE* fp;
public:
BinFile(const char* path, const char* mode) : fp(fopen(path, mode)) {}
~BinFile() { if (fp) fclose(fp); }
bool write(const void* buf, size_t size, size_t count) {
return fwrite(buf, size, count, fp) == count;
}
bool read(void* buf, size_t size, size_t count) {
return fread(buf, size, count, fp) == count;
}
};