文件讀寫關於字符的錯誤&解決方案

最近打哈夫曼編碼,壓位之後須要支持任意數據的字節流文件讀寫,而後一堆玄學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; 
}
相關文章
相關標籤/搜索