Чтобы "отгрызть" кусок файла с конца, не создавая при этом новый, можно воспользоваться функцией
ftruncate - откинуть лишнюю часть файла.
"Отгрызть" сначала, не создавая новый файл, не получится. Нужно только обрабатывать кусками.
1. чтобы не "повесить" систему, надо всегда обрабатывать файлы через "окно", т.е.
фиксированными блоками (бинарные данные или текстовые с о-о-очень длинными "строками") или построчно (для коротких строк), считывая через fgets (
пример) - резервируется кусок памяти под размер конкретной строки.
2. альтернативно, можно "отгрызать" при помощи потоковых обработчиков типа
sed,
gawk (GNU) - регулярками или другими специальными средствами. Есть также
logrotate, но это другое, для файлов журналов.