Как считать из файла двоичные числа величиной максимум 8 бит и записать в массив?

Нужно написать программу, которая обнаруживает 2 наименьших (минимум) и 2 наибольших (максимальных) элемента из одномерного массива из десяти чисел, введенных в двоичном коде (макс. 8 бит), который программа считывает из файла. Он печатает все числа на экране вместе с их транскрипцией в десятичной системе, включая минимумы и максимумы.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 89
#define Z 10

void qs(long int *s_arr, int first, int last);
int dec2bin(int num);

int main()
{
// variables
char binArr[N];
char *end;

long int decArr[Z];

// opening a file and reading from it
FILE *f = fopen("01.txt", "rb");
while (!feof(f))
{
    fread(binArr,strlen(8),10,f);
    // fgets(binArr, N, f);
}
printf("%s\n", binArr);
printf("---------------------------------\n");
fclose(f);
// decimal conversion

decArr[0] = strtol(binArr, &end, 2);
for (int i = 1; i < 10; i++)
{
    decArr[i] = strtol(end, &end, 2);
}
// output binary numbers in decimal format
for (int i = 0; i < 10; i++)
{
    printf("#%d - %d = %ld\n", i + 1, dec2bin(decArr[i]), decArr[i]);
}
// sorting an array
qs(decArr, 0, Z - 1);
// max and min output
printf("max#1= %d = %ld\n", dec2bin(decArr[Z - 1]), decArr[Z - 1]);
printf("max#2= %d = %ld\n", dec2bin(decArr[Z - 2]), decArr[Z - 2]);
printf("min#1= %d = %ld\n", dec2bin(decArr[0]), decArr[0]);
printf("min#2= %d = %ld\n", dec2bin(decArr[1]), decArr[1]);
}

int dec2bin(int num)
{
int bin = 0, k = 1;

while (num)
{
    bin += (num % 2) * k;
    k *= 10;
    num /= 2;
}

return bin;
}

void qs(long int *s_arr, int first, int last)
{
if (first < last)
{

    
    int left = first, right = last, middle = s_arr[(left + right) / 2];
    do
    {
        
        while (s_arr[left] < middle)
            left++;
        while (s_arr[right] > middle)
            right--;
        if (left <= right)
        {
            // as soon as the elements meet, we divide into 2 parts and do the same
            int tmp = s_arr[left];
            s_arr[left] = s_arr[right];
            s_arr[right] = tmp;
            left++;
            right--;
        }
    } while (left <= right); 
    
    qs(s_arr, first, right);
    qs(s_arr, left, last);
   }
  }

Ответы (1 шт):

Автор решения: Sergey

Ну, для начала, если Вы желаете прочитать 10 байт из двоичного файла, то вместо совершенно непонятной конструкции:

while (!feof(f))
{
    fread(binArr,strlen(8),10,f);
    // fgets(binArr, N, f);
}

Надо просто написать так:

fread(binArr,10,1,f);

Оператор печати

printf("%s\n", binArr);

Тоже как-то напряг моё воображение... Смысл его остался для меня непостижим :-( Если Вы хотели распечать 10 чисел, то надо надо было сделать так:

for(j=0; j<10; j++) printf("%d ", binArr[j]);

Если же Вы считаете, что нужно печатать строку, то откуда в этой строке может появиться нуль-терминатор?

Мне кажется, что вам надо пока с языком разбираться...

→ Ссылка