fread () не работает должным образом - PullRequest
0 голосов
/ 19 мая 2018

У меня есть файл .obj, содержимое которого выглядит следующим образом:

0000000 ca de 00 00 00 07 12 01 14 49 16 91 12 da 52 83
0000010 52 d2 52 da                                    
0000014

Я хотел бы прочитать его содержимое в структуру, которая указывает на целочисленный массив, называемый memory:

typedef struct {
   // ....Some code....

    // Machine memory - all of it
    unsigned short int memory[65536];
} MachineState;

Однако у меня проблемы с fread().После объявления этого следующим образом:

FILE *src_file = fopen(filename, "rb");
        //Read from binary file
        int byte = fread(theMachineState->memory, 1, sizeof(unsigned short), src_file);

        //Below are print statements for theMachineState->memory and byte..

Я только когда-либо вижу cade в memory[] (или deca в зависимости от порядкового номера машины).Не удается прочитать остальное содержимое.Что мне здесь не хватает?Вызов fread() два раза подряд заполняет memory[] одним нулем, и в обоих случаях число прочитанных байтов всегда равно 2.

Любая помощь искренне приветствуется!

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Остальное не «не прочитать»;вы говорите, что нужно прочитать только один unsigned short.

fread(theMachineState->memory, 1, sizeof(unsigned short), src_file);

Второй и третий аргументы называются size и nmemb, которые означают размер каждого элемента данных иколичество элементов данных для чтения.Вы передаете 1 (т. Е. Каждый элемент составляет 1 байт) и sizeof(unsigned short), что, вероятно, равно 2. Итак, вы говорите ему прочитать два байта.

Возможно, вы хотели сделать что-то вроде:

fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file);

(который вернет число прочитанных значений unsigned short, т.е. 65536, если он заполнит весь буфер), или:

fread(theMachineState->memory, 1, sizeof(theMachineState->memory), src_file);

(который вернет число bytes read, т.е., вероятно, 131072, если он заполняет весь буфер).

0 голосов
/ 19 мая 2018

fread() принимает два параметра , которые определяют, сколько байтов будет прочитано.Поскольку вы передаете size == 1 и count == sizeof(unsigned short), вы просите fread() прочитать (вероятно) 2 объекта размера 1 - поэтому вы видите в памяти только cade (если вы вызвали его дважды, каким-то образом).

Вместо этого попросите:

fread(theMachineState->memory, sizeof(unsigned short), 65536, src_file)
...