2010-07-14 52 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);