Каждый байт в файле перевести в биты - C (СИ)

Формулировка задачи:

Доброго дня Всем! Ребят, прошу помощи. ТЗ: Есть файл 1.dat в котором хранятся байты. 1) Прочитать весь файл побайтово. 2) Каждый байт в файле перевести в биты. 3) сгруппировать биты по 3. (трибиты) 4) дальше работать с ними. Первые два пункта получились так:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <locale.h>
 
int main(){
    setlocale(LC_ALL, "rus");
    
    char file_name[32];
    int  i;
    unsigned char buffer, bits;
    
printf ("Введите имя файла:\n");
gets(file_name);
 
  FILE *fin;
  FILE *fout;
 
  fin=fopen(file_name,"r");  
  if (!fin) {
   printf ("Ошибка открытия файла %s.\n", &file_name);
   exit(1);
  }
 
  else {
 
   fout=fopen("out.txt","w+");
   if (!fout) {
    printf ("Ошибка открытия файла out.txt.\n");
    exit(1);
        } 
    }
 
    buffer=fgetc(fin);
    
    for (int i=0; i<8; i++)
{
    bits=(buffer >> i) & 1;
    if (bits== 0) {
        fputc(0, fout); printf("0");    
    }
    else {
        fputc(1, fout); printf("1");
    }
}        
return 1;
}
Введу не очень хорошего знания языка, на выходе получаю только 8 бит. Скорее всего первого в файле байта. Как модернизировать мой код, чтобы получить полностью весь файл в битах в out.txt. Записать все биты в out.txt в hex представлении. И параллельно хочу записать в другой файл уже в понятном для человека формате т.е. открываешь txt а там 0101000101.

Код к задаче: «Каждый байт в файле перевести в биты - C (СИ)»

textual
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    FILE* f = fopen("1.dat", "r");
    if (!f) {
        printf("Error reading file\n");
        return 1;
    }
    if (fseek(f, 0, SEEK_END)) {
        printf("Error reading file\n");
        fclose(f);
        return 1;
    }
    int size = ftell(f);
    if (fseek(f, 0, SEEK_SET)) {
        printf("Error reading file\n");
        fclose(f);
        return 1;
    }
    char* data = (char*)malloc(size);
    if (!data) {
        printf("Memmory allocation error\n");
        fclose(f);
        return 1;
    }
    fread(data, 1, size, f);
    fclose(f);
    char* bits = (char*)malloc(CHAR_BIT*size);
    if (!bits) {
        printf("Memmory allocation error\n");
        free(data);
        return 1;
    }
    int k = 0;
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < CHAR_BIT; ++j) {
            bits[k++] = data[i] & (1 << j) ? '1' : '0';
        }
    }
    free(data);
    f = fopen("out.txt", "w");
    if (!f) {
        printf("Error writing file\n");
        free(bits);
        return 1;
    }
    fwrite(bits, 1, CHAR_BIT*size, f);
    fclose(f);
    free(bits);
    printf("Done\n");
    return 0;
}

10   голосов, оценка 3.900 из 5


СОХРАНИТЬ ССЫЛКУ