Преобразовать прочитанное число в беззнаковое короткое в C - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь преобразовать прочитанное число в 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 голосов
/ 28 июня 2018

Вы можете использовать функцию 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.

Надеюсь, это поможет вам.

0 голосов
/ 28 июня 2018

Это не имеет ничего общего с чтением из файлов. Вы не можете просто привести строку (на самом деле указатель на char) к числу и ожидать, что она сделает что-нибудь разумное.

Вместо этого вам следует использовать функцию преобразования, например strtoul (объявлено в <stdlib.h>) или sscanf (объявлено в <stdio.h>). Но убедитесь, что указали строку, то есть убедитесь, что buffer завершен нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...