2013-03-01 2 views
0

Привет, я пытаюсь закончить мой проект и им путать про чтение байтов из двоичного файла. моя цель читается 2 байта каждый раз до EOF. я хочу сначала проверить, первый бит первого байта 0 или 1, и я хочу распечатать остаток 7 бит, как целое. Также я хочу напечатать вторые байты, как integer.So у меня есть этотчтение из двоичного файла 2 байта каждый раз

short test[2]; 
while((fread(&test,sizeof(short),1,ifp)!=0) //ifp is input file pointer 
    { 
     fread(&test,sizeof(short),1,ifp); 
     printf("test first byte :%d\n",test[0]); 
     printf("test seocnd byte : %d\n",test[1]; 
} 

я не знаю, им чтение верно или нет, а также я не мог понять, как им собираются получить первый бит первого байта и отдых 7 бит, как целые и как im gonna printout второй байт, как целое.

Thnx ..

+0

Вы читаете один короткий (дважды). Почему вы печатаете два? Также: вы должны использовать аргументы varargs для printf для int, так как% d ожидает аргумент int. (вероятно, это будет сделано с помощью сопоставления аргументов-дополнений/стеков, но это по-прежнему небрежная привычка) – wildplasser

+0

Вы должны прочитать о побитовых операторах. –

+0

да, вы, ребята, я дважды проверял. У меня проблемы с бинарными файлами. Мне нужно больше изучать бинарные файлы. thnx – ccc

ответ

2

Второй Fread не нужно, вы не должны принимать адрес массива (без &test), также необходимо использовать обугленного тип, который является 1 байт:

unsigned char test[2]; 
while((fread(test,2,1,ifp) == 1) //ifp is input file pointer 
    { 
     int first_bit = test[0] & 0x80; 
     printf("test first byte 7 bits :%d\n", test[0] & 0x7f); 
     printf("test second byte : %d\n",test[1]; 
} 
+0

ОК, я понимаю. Ты прав. Мне не нужен второй фаст. да и я читал 2 раза такие же данные. как насчет первой проверки бит? Я хочу проверить первый бит первого байта 0 или 1. поэтому для этой проблемы я могу использовать if (test [0]> 128) // если его истинный первый бит должен быть 1 правильно? – ccc

+0

'int first_bit = test [0] & 0x80;' делает это. Поэтому вы можете выполнить 'if (test [0] & 0x80)', чтобы проверить, установлен ли первый бит ** **. – perreal

+0

да я вижу thnx, я работаю в течение 9 часов, я не мог видеть жалко. – ccc

1

Никто не гарантирует short 2 байта, это не менее 2 байта. И вы читаете один короткий и используя его и следующий. Сделайте так:

unsigned char test[2]; 
while((fread(&test, 1, 2, ifp) > 0) { //ifp is input file pointer 
     printf("test first byte: %u, second byte: %u\n", test[0], test[1]); 
} 

Это читает два байта в один присест, проверяет его читать что-то (возвращаемое значение количество элементов чтения), и выводит их.

+0

Почему мы сравниваем с> 0 в цикле while? Я не понимаю, как им найти EOF в двоичном файле. – ccc

+0

Поскольку файл заканчивается ... и 'fread (3)' не возвращает EOF, он возвращает 0, если ничего не может быть прочитано. – vonbrand

+0

подождите, подождите; while ((fread (test, 2,1, ifp) == 1) // ifp является введенным указателем файла im confused теперь im gonna compare 0 или 1 ?? – ccc

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