Это выглядит так:
- Искать до одного байта до конца файла, используя
fseek
. Нет гарантии, что в последней строке будет EOL, поэтому последний байт на самом деле не имеет значения.
- Считать один байт, используя
fgetc
.
- Если этот байт является EOL, то последняя строка - это одна пустая строка, и она у вас есть.
- Используйте
fseek
снова, чтобы перейти назад на два байта и проверить этот байт с помощью fgetc
.
- Повторяйте выше, пока не найдете EOL. Если у вас есть EOL, указатель файла будет в начале следующей (от конца) строки.
- ...
- Прибыль.
По сути, вы продолжаете выполнять (4) и (5), отслеживая, где вы были, когда нашли начало строки, чтобы вы могли вернуться туда до начала сканирования для начала следующей строки.
Пока вы открываете файл в текстовом режиме, вам не нужно беспокоиться о многобайтовых EOL в Windows (спасибо за напоминание, мистер Лутц).
Если вам дают ввод без поиска (например, канал), то вам не повезет, если вы сначала не захотите сбросить данные во временный файл.
Так что вы можете сделать это, но это довольно уродливо.
Вы можете сделать почти то же самое, используя mmap
и указатель, если у вас есть mmap
и «файл», с которым вы работаете, сопоставим. Техника была бы почти такой же: начинайте с конца и возвращайтесь назад, чтобы найти конец предыдущей строки.
Re: «Я тот, кто создает этот файл. Итак, могу ли я создать его в обратном порядке? Возможно ли это?»
Вы столкнетесь с такими же проблемами, но они будут хуже. Файлы в C являются по своей сути последовательными списками байтов, которые начинаются в начале и идут до конца; ты пытаешься работать против этого фундаментального свойства, а идти против основ никогда не бывает весело.
Вам действительно нужны ваши данные в виде простого текстового файла? Может быть, вам нужен текст / обычный текст в качестве окончательного результата, но все время до конца? Вы можете хранить данные в индексированном двоичном файле (возможно, даже в базе данных SQLite), и тогда вам нужно будет только беспокоиться о сохранении (или оконном) индекса в памяти, и это вряд ли будет проблемой (и если это так, используйте «реальная» база данных); затем, когда у вас есть все ваши строки, просто поменяйте местами указатель и начинайте.