代码之家  ›  专栏  ›  技术社区  ›  kdbdallas

从文件中读取扩展ASCII字符并转换为ASCII十进制值

  •  0
  • kdbdallas  · 技术社区  · 14 年前

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

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

    下面是一段代码,以帮助显示我目前正在做什么。。。

    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需要使用无符号字符,但是更改为无符号字符并不能解决问题(并给出编译警告)

    ....
    
    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,要么一些“随机”值。

    值:%(正确)

    所以很明显我做错了什么,但我就是想不通。。。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Matthew Flaschen    14 年前

    int c = (int)value;
    

    应该是:

    int c = *value;
    

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

    这个 strcpy fgets 将写入两个字节(最后一个是NUL终止符),除非它有错误或EOF。如果您确实想在手动之前用NUL终止它,您将使用'\0'(NUL),而不是'0'(ASCII数字0)。你可以简单地做:

    *value = '\0';
    
        2
  •  0
  •   caf    14 年前

    您的代码远比需要的复杂-您可以简单地执行以下操作:

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