Логика программы ужасна
Ты по нескольку раз перезаписываешь одно и то же значение.
(подсказка: Seek() для твоей задачи не нужна! Переделай код так, чтобы от нее избавиться)
а ошибка у тебя в следующем:
BlockRead(f, fs[1], Length(fs),
NRead);
NRead - количество прочитанных байт, оно может быть
меньше или равно Length(fs). Когда ты подходишь к концу файла - ты читаешь меньше чем у тебя длина строки, а пишешь - как длина строки:
BlockWrite(f2, fs[1],
Length(fs[1]), NWrite);
Т.е. пишешь мусор из буфера...