【问题标题】:Read Extended ASCII Characters from File and Convert to ASCII Decimal Value从文件中读取扩展的 ASCII 字符并转换为 ASCII 十进制值
【发布时间】:2010-07-14 04:21:57
【问题描述】:

我正在尝试读取文件的内容(其中包含“标准”文本和“二进制”数据)。

然后我需要获取该字符(标准或扩展 ASCII)并获取相应的十进制 (int) ASCII 值。

我有很多时间让它正常工作。

这是代码的 sn-p 以帮助显示我目前在做什么......

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,但是更改为 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(数字每次都不同,但在同一个“范围”内)(有人告诉我这是不正确的):)

所以我显然做错了什么,但我似乎无法弄清楚......

非常感谢任何帮助。

【问题讨论】:

    标签: c type-conversion


    【解决方案1】:

    我认为你的主要问题是:

    int c = (int)value;
    

    应该是:

    int c = *value;
    

    您正在取消引用值以获取该位置的角色。这相当于value[0]。之前,您将一个指向 int 的指针强制转换,这解释了大垃圾值。不要抛开你的问题。

    strcpy 是多余的,因为fgets 将写入两个字节(最后一个是 NUL 终止符),除非它有错误或 EOF。如果您确实想事先 NUL 终止它,您将使用 '\0' (NUL),而不是 '0'(ASCII 数字 0)。你可以这样做:

    *value = '\0';
    

    【讨论】:

    • 这对于使用 char 的 '%' 似乎很有效。我需要使用其他东西来扩展 ascii 还是我仍然可以使用 char?
    • 实际上,您应该在读取之前确保数组/字符串指针类型为unsigned char *(或将其转换为此类)。顺便说一句,没有“扩展 ASCII”之类的东西。
    • +1 表示添加显式转换以避免警告/错误通常表明代码一开始就是错误的。
    【解决方案2】:

    您的代码比它需要的复杂得多 - 您可以简单地这样做:

    FILE *fp = fopen(file, "r+");
    
    fseek(fp, offset, SEEK_SET);
    
    int c = fgetc(fp);
    

    【讨论】:

      猜你喜欢
      • 2014-10-17
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2015-02-20
      • 2018-05-11
      • 1970-01-01
      • 2011-11-21
      • 2012-03-27
      相关资源
      最近更新 更多