чтение шестнадцатеричных данных из файла fscanf в формате предупреждения о времени компиляции - PullRequest
1 голос
/ 29 июня 2011

Я читаю некоторые данные из файла. Формат указан как

ASCII-текст в стиле UNIX Концы строк, серия из 32 бит целые числа со знаком в шестнадцатеричном формате.

1007 * например *

08000000

Я использую fscanf для чтения этих данных.

long data_size;

FILE *fp;
fp=fopen("test01.bin", "r"); // open for reading
if (fp==0) {cerr << "Error openeing file"<<endl; return 1;}

fscanf(fp, "%x", &data_size);

Все работает нормально с моим тестовым файлом, но я получаю предупреждение во время компиляции,

warning: format ‘%x’ expects type ‘unsigned int*’, but argument 3 has type ‘long int*’

однако шестнадцатеричное значение не имеет знака и приводится к большой дозе? Как долго займет самое значительное время, как уведомление о знаке? Или у меня возникнут проблемы? Или я в порядке в моем понимании?

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Проблема в том, что %x требует unsigned int * для считывания значения, но у вас есть long *. Заголовок <stdint.h> предоставляет типы значений с фиксированной длиной, а <inttypes.h> определяет соответствующие макросы для использования с printf, scanf и их производные. Я думаю, что для вас будет лучше fscanf данных в переменную int32_t, используя макрос, предоставленный <inttypes.h>:

#include <inttypes.h>

...

int32_t data_size;
fscanf(fp, "%" SCNx32, &data_size);
0 голосов
/ 29 июня 2011

Вы должны поддерживать тот же тип указателя, что и в состояниях предупреждения, иначе вы столкнетесь с серьезными проблемами, если захотите перенести свой код на другие архитектуры (например, 64-битные архитектуры), где long имеет размер, отличный от int.Это особенно сложно, если вы используете указатели.(Однажды у меня была ошибка, возникшая из точно этой проблемы)

Просто используйте int data_size, и все будет в порядке.

...