Почему я не получаю ожидаемых результатов с помощью fread () в C? - PullRequest
1 голос
/ 06 апреля 2010

Вот мой код:

#include <stdio.h>

int main(void) {

        FILE *fp;
        unsigned int i;
        char bytes[512];
        fp = fopen("myFile","r");
        for(i = 0;i <= 512;i++) {
                fread(&bytes, sizeof(bytes), 1, fp);
                printf("bytes[%d]: %x\n", i, bytes[i]);
        }
}

Вот ожидаемый результат

$ hexdump myFile
0000000 aa55 aa55 0060 0000 0a17 0000 b1a5 a2ea
0000010 0000 0000 614c 7563 616e 0000 0000 0000
0000020 0000 0000 0a68 0000 1001 421e 0000 0000
0000030 f6a0 487d ffff ffff 0040 0000 002f 0000

Но вот что я вижу из моей программы

bytes[0]: 55
bytes[1]: 8
bytes[2]: ffffffc8
bytes[3]: ffffffdd
bytes[4]: 22
bytes[5]: ffffffc8
bytes[6]: ffffff91
bytes[7]: 63
bytes[8]: ffffff82

Мое очевидное предположение состоит в том, что я либо адресую что-то неправильно и получаю неправильные данные обратно, либо я печатаю это неправильно и смотрю это неправильно.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2010

RichieHindle уже решил основную часть проблемы , теперь я хотел бы помочь с второстепенной частью.

Когда вы печатаете результаты, ваши char s расширяются до int s. Для положительного числа это не имеет значения, но для отрицательного числа (что-нибудь> = 0x80) вы получаете набор знаковых битов, вставленных в начале. Это легко исправить:

printf("bytes[%d]: %x\n", i, bytes[i] & 0xff); 
3 голосов
/ 06 апреля 2010

Вы читаете последовательные 512-байтовые чанки из своего файла каждый раз в цикле и печатаете только один байт каждого чанка. Возможно, вы захотите прочитать эти 512 байт за один раз, а затем распечатать их, например, так:

fread(&bytes, sizeof(bytes), 1, fp);
for(i = 0;i < 512;i++) {
    printf("bytes[%d]: %x\n", i, bytes[i]);
}

(Также: некоторая проверка ошибок не сработает, и, как отмечает Дэв, вы должны проверить, действительно ли вы читаете ожидаемое количество байтов из файла.)

1 голос
/ 06 апреля 2010

Дополнительные примечания. В цикле произошла ошибка, вы печатаете 513 элементов.

0 голосов
/ 06 апреля 2010

Пара комментариев:

1) У вас есть цикл в цикле, выполняемый 512 раз, и вы каждый раз читаете 512 байт. Переместите fread из цикла и прочитайте его за один раз или измените параметр 2, чтобы fread до размера int, если вы хотите прочитать его в цикле.

2) Вы не проверяете количество фактически прочитанных байтов или если файлы были успешно открыты.

...