Разбиение любых файлов на несколько частей - C (СИ)

Узнай цену своей работы

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

Есть ли, какая-нибудь функция с которой можно разбивать любые файлы по битам? Например, картинка размеров в 1 мегабайт, мне нужно ещё разбить на 5 частей, то есть, чтобы одна часть была размером в 200 килобайт

Решение задачи: «Разбиение любых файлов на несколько частей»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
long file_size(const char* filename)
{
    size_t len = 0;
    FILE *file = fopen(filename, "r");
    fseek(file, 0L, SEEK_END);
    len = ftell(file);
    fclose(file);
    return len;
}
 
size_t number_length(size_t num)
{
    size_t count = 1;
    if (num < 10)
        return 1;
    do
    {
        count++;
    }
    while (num /= 10);
    return num;
}
 
int split_file(const char* filename, size_t chunks_count)
{
    FILE *file = NULL, *temp_file = NULL;
    char *buf;
    char *chunk_file_name = NULL;
    size_t chunk_index = 0U;
    size_t chunk_file_name_length = 0;
    size_t readed_bytes;
    size_t filename_length = strlen(filename);
    chunk_file_name_length = filename_length + number_length(chunks_count) + 5;
    chunk_file_name = (char*)calloc(chunk_file_name_length, sizeof(char));
    long chunk_size = file_size(filename) / chunks_count;
    buf = calloc(chunk_size, sizeof(char));
    file = fopen(filename, "r");
    
    if (!file)
    {
        return 1;
    }
    while (!feof(file) && !ferror(file))
    {
        strcpy(chunk_file_name, filename);
        strcat(chunk_file_name, ".part%d");
        sprintf(chunk_file_name, chunk_file_name, chunk_index);
        chunk_index++;
        
        readed_bytes = fread(buf, sizeof(char), chunk_size, file);
        
        if (readed_bytes == 0)
        {
            break;
        }
        
        temp_file = fopen(chunk_file_name, "w");
        if (!temp_file)
        {
            free(buf);
            free(chunk_file_name);
            fclose(file);
            return 1;
        }
        
        fwrite(buf, sizeof(char), readed_bytes, temp_file);
        if (fclose(temp_file))
        {
            free(buf);
            free(chunk_file_name);
            fclose(file);
            return 1;
        }
        memset(chunk_file_name, 0, chunk_file_name_length);
    }
    free(buf);
    free(chunk_file_name);
    return fclose(file);
}
 
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        puts("Invalid parameters");
    }
    else
    {
        char *filename = argv[1];
        size_t chunks_count = 0;
        if (sscanf(argv[2], "%zu", &chunks_count) != 1)
        {
            fprintf(stderr, "Invalid argument %s\n", argv[2]);
            return 0;
        }
        return split_file(filename, chunks_count);
    }
}

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

  1. В функции main проверяется корректность ввода данных пользователем. Если пользователь вводит некорректные данные, выводится сообщение об ошибке и программа завершается.
  2. В функции split_file создаются и открываются файлы для чтения исходного файла и записи разделенных частей.
  3. В функции split_file файл исходного файла открывается в режиме чтения (r).
  4. В функции split_file файлы для записи разделенных частей создаются с помощью функции fopen с указанием имени файла и режима записи (w).
  5. В функции split_file выполняется чтение исходного файла и запись разделенных частей в созданные файлы.
  6. В функции split_file после завершения чтения исходного файла и записи разделенных частей в файлы, файлы с разделенными частями закрываются.
  7. В функции split_file после завершения работы с файлами, исходный файл закрывается.
  8. В функции number_length выполняется определение длины числа, представленного в виде строки.
  9. В функции file_size определяется размер файла.
  10. В функции main выполняется проверка корректности ввода данных пользователем.
  11. В функции main определяется количество частей, на которые необходимо разделить файл.
  12. В функции main передаются аргументы командной строки в функцию split_file.
  13. В функции main выполняется вызов функции split_file.
  14. В функции main выводится сообщение об успешном выполнении программы.
  15. В функции main обрабатывается ошибка, возникающая при попытке чтения некорректного аргумента.
  16. В функции main программа завершается.
  17. В функции split_file используется функция calloc для выделения памяти под буфер чтения исходного файла.
  18. В функции split_file используется функция fread для чтения данных из исходного файла в буфер.
  19. В функции split_file используется функция fwrite для записи данных из буфера в файл с текущей частью.
  20. В функции split_file используется функция fclose для закрытия файлов.

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


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

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

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