最近打哈夫曼編碼,壓位之後須要支持任意數據的字節流文件讀寫,而後一堆玄學bug調了我一天。。windows
好在終於能夠把bug彙總了:函數
1.0x1A問題:用字符文件讀入時,讀到0x1A會提早中斷,返回-1(unsigned char爲255)。實際上這是Windows系統一個遠古bug,由於曾經0x1A就是EOF,然而如今EOF已經變爲-1了。編碼
解決方案:使用rb二進制文件讀入,能夠防止讀入函數進行加工轉義。指針
2.判斷文件結束問題:EOF爲255,然而對於字符0xFF(255),EOF將會和0xFF重複。然而實際上EOF返回的是一個int類型整數-1,即0xFFFFFFFF,而被unsigned char截斷之後,就只剩下了0xFF,沒法和字符0xFF區分。blog
解決方案:使用unsigned short類型讀入。get
3./r字符自動補全:Windows系統下會自動將/n字符補全爲/r/n,因此要判斷當前讀到的這個/r到底是自動補全的仍是原本就是數據裏面的。class
解決方案:對於原本就是/n轉換成/r/n的,直接跳過/rbug
對於原本就是/r後面接了一個/n的,將會變成/r/r/n,要去掉其中的一個/r二進制
對於原本就是/r的,讀入判斷確實只有/r之後,復位按照這一次就是/r的狀況進行操做(fseek把文件位置指針轉移回來一個)數據
最終實現的win下fgetc二進制文件的函數:
bool fgetc_windows(FILE *in, unsigned char &ret) { unsigned short ch_buf; if((ch_buf = fgetc(in)) == 0xffff) return false; if(ch_buf == 13 && (ch_buf = fgetc(in)) != 10) { fseek(in, -1, 1); ch_buf = 13; } ret = (unsigned char) ch_buf; return true; }