Чтение и запись 64 бит на 64 бит в C

У меня есть этот супер простой код, где я читаю блоки из 8 байтов (я буду их шифровать позже в коде), а затем записываю их в новый файл.

Это работает хорошо, но для последних 8 байтов, которые не записываются. Любая идея почему?

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

int main()
{
    uint64_t data;
    FILE *input, *output;

    // create output file

    output = fopen("output.txt", "w");

    // read file
    input = fopen("test.txt", "rb");

    if(input)
    {
        while(fread(&data, 8, 1, input) == 1)
        {
            fwrite(&data, 8, 1, output);
        }

        size_t amount;
        while((amount = fread(&data, 1, 8, input)) > 0)
        {
         fwrite(&data, 1, amount, output);
        }

        fclose(input);
        fclose(output);
    }

    return EXIT_SUCCESS;
}

Ответ 1

fread(&data, 8, 1, input)

пытается прочитать один "элемент" с 8 байтами в буфер и возвращает количество элементов. Если из текущей позиции в EOF осталось меньше 8 байтов, она возвращает 0.

Одним из возможных решений было бы вместо 8 пунктов: 1 байт:

ssize_t amount;
while ((amount = fread(&data, 1, 8, input)) > 0)
{
    fwrite(&data, 1, amount, output);
}

Внутри блока while вы можете проверить, имеет ли amount 8 или меньше, для вашего метод шифрования.