Каждый байт в файле перевести в биты - 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, что означает успешное выполнение программы