2010-07-14 53 views
0

我正在嘗試讀取文件(其中包含「標準」文本和「二進制」數據)的內容。從文件讀取擴展ASCII字符並將其轉換爲ASCII十進制值

然後我需要採取該字符(標準或擴展ASCII)並獲得相應的十進制(int)ASCII值。

我有一段時間讓它正常工作。

這裏是代碼,以幫助顯示我正在做的事情的一個片段......

FILE *fp = fopen(file, "r+"); 

char *value = NULL; 

size_t charSize = sizeof(char) + 1; 

value = malloc(charSize); 

strcpy(value, "0"); 

fseek(fp, offset, SEEK_SET); 

fgets(value, charSize, fp); 

int c = (int)value; 

free(value); 

我看了是說,你需要使用一個無符號字符的ASCII擴展的事情,但是改變爲unsigned char不解決問題(並給編譯警告)

我也使用的wchar_t的代碼嘗試:

.... 

wchar_t *value = NULL; 
value = malloc(2); 

wcscpy(value, (wchar_t *)""); 

fseek(fp, offset, SEEK_SET); 

fgetws(value, 2, fp); 

int c = (int)value; 

這些都不似乎工作。基本上所有的東西都是0,或者是一些「隨機」的值。

例如使用任何三個,我得到: 值:%(正確) C:76678304(號碼是每次都不同,但在這同「範圍」)(東西告訴我這是不正確的): )

那顯然我做錯了什麼,但我似乎無法推測出來......

任何幫助將是非常讚賞。

回答

2

我認爲你的主要問題是:

int c = (int)value; 

它應該是:

int c = *value; 

你提領值來獲得該位置的字符。這相當於value[0]。之前,您正在投射一個指向int的指針,該指針解釋了大型垃圾值。不要把你的問題拋出去。

strcpy是多餘的,因爲fgets會寫入兩個字節(最後一個是NUL-終止符),除非它有一個錯誤或EOF。如果你真的想NUL終止它,你會使用'\ 0'(NUL),而不是'0'(ASCII數字0)。你可以簡單地做:

*value = '\0'; 
+0

這似乎工作的偉大使用字符「%」。我需要使用其他的擴展ascii還是我仍然可以使用char? – kdbdallas 2010-07-14 04:31:49

+0

實際上你應該確保數組/字符串指針類型在讀取之前是'unsigned char *'(或者將其轉換爲這種類型)。順便說一句,沒有「擴展ASCII」這樣的東西。 – 2010-07-14 08:46:09

+0

+1表示添加明確的轉換以避免警告/錯誤通常表示代碼在開始時是錯誤的。 – 2010-07-14 09:29:58

0

你的代碼是遠遠複雜得多,它需要 - 你可以簡單地這樣做:

FILE *fp = fopen(file, "r+"); 

fseek(fp, offset, SEEK_SET); 

int c = fgetc(fp);