Вот этот код:
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

#define SHIFT_6 6
#define SHIFT_8 8
#define MAX_CAPACITY 4096

int32_t sum_of_squares(int32_t x, int32_t mod) {
    int64_t x64 = x;
    int64_t sum = x64 * (x64 + 1) * (2 * x64 + 1) / SHIFT_6;
    return (int32_t)(sum % mod);
}

int main(int argc, char *argv[]) {
    if (argc != 4) {
        return 1;
    }

    const char *input_filename = argv[1];
    const char *output_filename = argv[2];
    char *endptr;
    int32_t mod = (int32_t)strtol(argv[3], &endptr, 10);
    if (*endptr != '\0' || mod <= 0) {
        return 1;
    }

    int input_fd = open(input_filename, O_RDONLY);
    if (input_fd < 0) {
        perror("open input file");
        return 1;
    }

    int output_fd = open(output_filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (output_fd < 0) {
        perror("open output file");
        close(input_fd);
        return 1;
    }

    struct stat st;
    if (fstat(input_fd, &st) != 0) {
        perror("fstat");
        close(input_fd);
        close(output_fd);
        return 1;
    }

    off_t file_size = st.st_size;
    if (file_size == 0) {
        close(input_fd);
        close(output_fd);
        return 0;
    }

    unsigned char buffer[MAX_CAPACITY];
    off_t bytes_read_total = 0;
    int32_t x = 0;
    int32_t result;

    while (bytes_read_total < file_size) {
        ssize_t bytes_to_read = sizeof(buffer);
        if (file_size - bytes_read_total < (off_t)sizeof(buffer)) {
            bytes_to_read = file_size - bytes_read_total;
        }

        ssize_t bytes_read = read(input_fd, buffer, bytes_to_read);
        if (bytes_read <= 0) {
            perror("read");
            close(input_fd);
            close(output_fd);
            return 1;
        }

        for (ssize_t i = 0; i < bytes_read; ++i) {
            unsigned char byte = buffer[i];
            for (int bit = 0; bit < SHIFT_8; ++bit) {
                x = (int32_t)(bytes_read_total * SHIFT_8 + i * SHIFT_8 + bit +
                              1);
                if (byte & (1 << bit)) {
                    result = sum_of_squares(x, mod);
                    ssize_t bytes_written =
                        write(output_fd, &result, sizeof(result));
                    if (bytes_written != sizeof(result)) {
                        perror("write");
                        close(input_fd);
                        close(output_fd);
                        return 1;
                    }
                }
            }
        }
        bytes_read_total += bytes_read;
    }

    close(input_fd);
    close(output_fd);

    return 0;
}
Решает задачу:
Submit a solution for sm09-4-unix/files/masked-summ-1

Full score:	100
Run penalty:	1
Time limit:	1 s
Real time limit:	5 s
Memory limit:	64M
Open date:	2024-11-16 00:00:00
Deadline:	2024-12-17 23:59:59
Date penalty formula:	2024-12-09 23:59:59 0
Problem sm09-4: unix/files/masked-summ-1

В аргументах командной строки задаются имя входного бинарного файла (FILE1), имя выходного бинарного файла (FILE2) и положительное 32-битное знаковое целое число (MOD). Файл FILE1 содержит множество положительных целых чисел, представленное в виде битового массива. Бит 0 (младший бит первого байта) в файле соответствует числу 1, бит 7 (старший бит первого байта) в файле соответствует числу 8 и т. д. Установленный бит означает, что соответствующее число присутствует во множестве. Для каждого числа x, присутствующего во множестве, хранящемся в FILE1, в бинарный файл FILE2 запишите 32-битное знаковое целое число $\sum_{i=1}^x i^2 \pmod{MOD}$, то есть остаток от деления на MOD суммы квадратов всех чисел от 1 до x включительно. Числа должны быть записаны в порядке возрастания значения x. Числа записываются в порядке байт хоста. Для работы с файлами использовать интерфейс системных вызовов.

Например, если входной бинарный файл содержит байт 0x93, и значение MOD равно 1000, то в выходной бинарный файл должны быть записаны числа 1, 5, 55, 204.

 

Submit a solution

Language:	gcc - GNU C 11.3.0
А вот этот нет:
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

enum Byte { BYTE = 8 };

int32_t get_sum(int32_t x, int32_t mod) {
    int32_t res = 0;
    for (int i = 1; i <= x; ++i) {
        res += (i * i) % mod;
    }

    return res % mod;
}

int main(int argc, char *argv[]) {
    char byte;
    int fd_file1 = open(argv[1], O_RDONLY);
    int fd_file2 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int32_t mod = strtol(argv[3], NULL, 10);

    while (1) {
        ssize_t cur_size = read(fd_file1, &byte, 1);
        if (cur_size < 1) {
            break;
        }

        int32_t mask = 1;
        for (int x = 1; x <= BYTE; ++x) {
            if (byte & mask) {
                int32_t sum = get_sum(x, mod);

                ssize_t write_size = write(fd_file2, &sum, sizeof(sum));
                if (write_size == 0) {
                    break;
                }
            }

            mask <<= 1;
        }
    }

    close(fd_file1);
    close(fd_file2);

    return 0;
}

Скажи, в чем проблема во втором коде