将读取的数字转换为C

时间:2018-06-28 16:07:27

标签: c file casting

我正在尝试将读取的数字转换为unsigned short

我的程序在文件中保存了一个特定的数字。之后,我尝试阅读它并将其转换为另一种类型。实际上,读取的值是正确的,但是当我强制转换时,它是一个不同的值。

这是我读取文件的方式:

fseek(fp, 0, SEEK_END);

int length = ftell(fp);
fseek(fp, 0, SEEK_SET);

char* buffer = malloc(length);
if (buffer) {
   fread(buffer, 1, length, fp);
}

fclose(fp);

我们假设该值为“ 1337”; 缓冲区的正确值为“ 1337”;

现在这是我尝试将值转换为unsigned short的方法:

unsigned short num = (unsigned short)buffer;

变量num的值现在不再与buffer相同。

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

这与从文件读取无关。您不能只将字符串(实际上是指向char的指针)强制转换为数字,并期望它做任何有意义的事情。

相反,您应该使用转换函数,例如strtoul(在<stdlib.h>中声明)或sscanf(在<stdio.h>中声明)。但是请确保为它提供一个字符串,即确保buffer为空终止。

答案 1 :(得分:0)

您可以使用atoi函数将缓冲区转换为整数。请参见下面的工作代码。

int main()
{
    FILE *fp = fopen("data.txt", "r");

    if(fp == NULL)
        exit(0);

    fseek(fp, 0, SEEK_END);

    int length = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    char* buffer = malloc(length + 1);
    if (buffer) 
    {
       fread(buffer, 1, length, fp);
    }

    //unsigned long num = (unsigned long)atol(buffer);
    unsigned short num = (unsigned short)atoi(buffer);

    printf("Number = %u\n", num);

    fclose(fp);
    return 0;
}

如果从理论上看,您有两个字节的数据,每个字节的值取决于字节的位置。

说数字是1337,十六进制是0x05 0x39。

因此对应的整数值=(0x05 * 2 ^ 8)+ 0x39 =(5 * 256)+ 57 = 1337。

希望它对您有帮助。