2012-05-31 2 views
1

Я довольно новыми для C, но я наткнулся на проблему с FREAD ...C, Fread двоичный из бен файла

Моя конечная цель, чтобы прочитать (а затем Printf утешать) двоичный файл .bin, файл, но сейчас я везу его на один шаг за один раз и пытаюсь просто прочитать первый бит ...

Моего код:

... 
FILE *file = fopen("test1.bin", rb); 
int i = 0; 
fread(&i, 1, 1, file); 
printf("%i\n", i); 
... 

Теперь я попытался это на три разных файла .bin, один вывод 0, другие 2 и другие 12!

Почему он выводит 2/12, когда я читаю только один бит из файла? Разве это не должно быть 0 или 1? Что я делаю не так? Большое спасибо.

+4

Вы читаете 1 байт, а не 1 бит. :) – Pethical

+0

Правильно, ладно, спасибо, поэтому, если бы я хотел читать всего 32 бита, я бы изменил 1, 1 - 4, 1? –

+2

Лучше изменить sizeof (int), 1. – Pethical

ответ

6

Изменение fread() вызов:

fread(&i, sizeof(int), 1, file); 

Второй аргумент является размер элемента для чтения, третий аргумент является количество элементов для чтения. Опубликованный код читает один байт в int.

Вы также должны проверить возвращаемые значения от fopen() и fread() звонков, чтобы убедиться, что они были успешными.

1

Как @hmjd сказал, вы должны прочитать количество байтов, необходимых для заполнения значения int. Так как этот путь:

len = fread(&i, sizeof(int), 1, file); 

или этот путь:

len = fread(&i, 1, sizeof(int), file); 

Первый случай считывает один int значение (как правило, как 4 байта). После вызова len должен быть равен 1, если чтение выполнено успешно.

Второй случай считывает несколько байтов в значение int. Разница в том, что после этого звонка len должен быть равен sizeof(int).

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

Преимущество второго метода заключается в том, что len точно определяет, сколько байтов было фактически прочитано (что может быть полезно для отладки ошибок ввода-вывода). Преимущество первого метода заключается в том, что это концептуально более простой тест на успех (был ли один int прочитан или нет?).

Но независимо от того, как вы это делаете, вы всегда должны проверить возвращаемое значение fread().

Смежные вопросы