我正在尝试将读取的数字转换为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
相同。
我在做什么错了?
答案 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。
希望它对您有帮助。