scanf из буфера данных в C / C ++ - PullRequest
0 голосов
/ 20 октября 2011

Я работаю с закрытым оборудованием и хочу загрузить текстовый файл.У меня есть только следующая функция для доступа к вторичной памяти:

bool load_file(const char *filename, int **buf, int *size)

Это означает, что я получу все данные в буфере и их размер по размеру.Как мне извлечь из него строки, целые числа или данные с плавающей запятой?Я хотел бы сделать это так же, как при использовании scanf.

Спасибо.

1 Ответ

4 голосов
/ 20 октября 2011

Вы можете использовать sscanf для сканирования блоков памяти вместо файлов, аналогично тому, как вы можете использовать sprintf до printf в памяти. Прототип:

int sscanf (const char *str, const char *format, ...);

Другими словами, то же самое, что и scanf, но с добавленным указателем.

Это для преобразования символьных данных в другие типы. Если у вас есть raw данные в этом буфере памяти, вы можете привести и отменить ссылку.

Другими словами, скажем, у вас есть буфер памяти с целым числом, начинающимся с пятой позиции (смещение 4), что-то вроде:

#include <stdio.h>
int main(void) {
    //                +--------------+--> little-endian,
    //                |              |       32-bit = 42.
    char xyz[] = "1234\x2a\x00\x00\x00";
    int x = *((int*)(xyz+4));
    printf ("%d\n", x);
    return 0;
}

Предполагая, что ваша целочисленная кодировка такая же, как у меня, это выдает 42 (шестнадцатеричное 2A). Разбирая это выражение по одному биту за раз:

        (xyz+4)  : Get the address four unit past xyz. Since xyz is a char
                   pointer, this means four bytes.
  (int*)(xyz+4)  : Cast it into an int pointer.
*((int*)(xyz+4)) : De-reference that to get the int at that address.
...