быстрый доступ к большому файлу - fseek ftell fsetpos fgetpos - PullRequest
1 голос
/ 09 марта 2012

Я столкнулся с необходимостью быстрого доступа к выбранным данным в гигабайтах. Как только я найду начальную точку, последующий доступ будет последовательным. Файлы содержат дату в начале каждой записи, и дата увеличивается по всему файлу. Я не хочу начинать с начала и читать файл, игнорируя все, что находится впереди. Меня интересуют ТОЛЬКО приложения WINDOWS. Я хотел бы открыть файл в текстовом режиме.

Мне приходит в голову, что я мог бы выполнить какой-то двоичный поиск, используя 64-битные функции fseek / ftell или fsetpos / fgetpos. Я понимаю, что мог бы искать середину записи с разделителями новой строки, но можно было бы подумать, что вы можете просто пропустить любую частичную запись с помощью вызова fgets.

fseek предлагает механизм SEEK_END источника, поэтому, похоже, его можно использовать с ftell для определения размера файла. Я не вижу аналогичного объекта с fsetpos / fgetpos. Как получить размер файла, если вы используете fsetpos / fgetpos?

_fseeki64 / _ftelli64 использует int64, а fpos_t, используемый fsetpos / fgetpos, также имеет тип int64, поэтому я должен иметь возможность выполнять арифметику с указателями.

Или я здесь не на том пути? Должен ли я рассмотреть какой-то другой подход?

1 Ответ

1 голос
/ 09 марта 2012

_fseeki64 / _ftelli64 делает именно то, что вы хотите, так почему вы не решаетесь их использовать? Ваш подход в порядке.

...