Каждый байт в файле перевести в биты - 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.

Решение задачи: «Каждый байт в файле перевести в биты»

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;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Объявляется функция main()
  3. Открывается файл 1.dat для чтения
  4. Проверяется корректность открытия файла
  5. Перемещается указатель чтения в конец файла
  6. Определяется размер файла
  7. Перемещается указатель чтения в начало файла
  8. Выделяется память под данные из файла
  9. Считываются данные из файла в выделенную память
  10. Закрывается файл
  11. Выделяется память под биты
  12. Инициализируется счётчик для записи битов
  13. Происходит запись битов в файл out.txt
  14. Закрывается файл out.txt
  15. Освобождается память, выделенная под биты
  16. Выводится сообщение Done
  17. Возвращается 0, что означает успешное выполнение программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы