Хотя я понимаю, что fpos_t
является непрозрачным типом, предназначенным для инициализации функцией fgetpos()
, §7.19.9.1 документа Обоснование C99 гласит, что:
fgetpos
иfsetpos
были добавлены в C89, чтобы разрешить операции произвольного доступа к файлам, которые слишком велики для обработки с помощьюfseek
иftell
.
и §7.19.9.2:
Необходимость кодировать как позицию записи, так и позицию внутри записи в значении
long
может привести к тому, что размер текстовых файлов, в которых могут использоватьсяfseek
иftell
, будет значительно меньше размера двоичных файлов....
fgetpos
иfsetpos
были добавлены для работы с файлами, которые слишком велики для обработки с помощьюfseek
иftell
.
По-видимому, это в первую очередь касается текстовых файлов (файлов, открытых с помощью mode
, за исключением флага b
), потому что в некоторых реализациях может потребоваться сохранение двух позиций (позиция записи файла и позиция символа записи), что может значительно уменьшить эффективный диапазон fseek()
. и ftell()
функций для текстовых потоков.
Тем не менее, я понятия не имею, как это особенно полезно для текстовых потоков, и я, конечно, не понимаю, как это можно эффективно использовать для «произвольного доступа».
Похоже, что единственный способ использовать эти функции — это прочитать каждый символ файла и кэшировать их значения fgetpos()
d fpos_t
, что в лучшем случае кажется нишевым, поскольку вы почти наверняка не хотите читать где-либо рядом с LONG_MAX
символами.
О чем думал «Комитет»? Есть ли обоснование C99?