Каждый байт в файле перевести в биты - C (СИ)
Формулировка задачи:
Доброго дня Всем! Ребят, прошу помощи.
ТЗ: Есть файл 1.dat в котором хранятся байты.
1) Прочитать весь файл побайтово.
2) Каждый байт в файле перевести в биты.
3) сгруппировать биты по 3. (трибиты)
4) дальше работать с ними.
Первые два пункта получились так:
Введу не очень хорошего знания языка, на выходе получаю только 8 бит. Скорее всего первого в файле байта. Как модернизировать мой код, чтобы получить полностью весь файл в битах в out.txt.
Записать все биты в out.txt в hex представлении. И параллельно хочу записать в другой файл уже в понятном для человека формате т.е. открываешь txt а там 0101000101.
#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; }
Решение задачи: «Каждый байт в файле перевести в биты»
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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Объявляется функция main()
- Открывается файл
1.dat
для чтения - Проверяется корректность открытия файла
- Перемещается указатель чтения в конец файла
- Определяется размер файла
- Перемещается указатель чтения в начало файла
- Выделяется память под данные из файла
- Считываются данные из файла в выделенную память
- Закрывается файл
- Выделяется память под биты
- Инициализируется счётчик для записи битов
- Происходит запись битов в файл
out.txt
- Закрывается файл
out.txt
- Освобождается память, выделенная под биты
- Выводится сообщение
Done
- Возвращается 0, что означает успешное выполнение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д