Быстрый доступ к позиции файла в ifs () C ++ - PullRequest
0 голосов
/ 04 июля 2018

Информация: Каков наилучший способ сохранить позицию в текстовом файле, закрыть файл, а затем открыть его в той же позиции, используя c ++?

У меня большой текстовый файл, который мне нужно проанализировать порциями и передать в какую-либо систему. На данный момент я загружаю файл в ifstream и затем getlines, пока не найду нужные данные (скажем, данные находятся в позиции {x}). После этого я закрываю файл, обрабатываю данные, и теперь мне нужно продолжить подачу данных из большого файла. Поэтому я снова открываю файл и получаю строки, пока не доберусь до позиции {x + d} на этот раз (d - смещение от прочитанных данных) ...

Вместо того, чтобы просматривать файл один раз, легко увидеть, что я иду (1d + 2d + ... + (N-1) d + Nd) ~ d * N ^ 2 раза через файл. Теперь я хочу сохранить позицию в файле после d, закрыть файл, а затем сразу же открыть файл в той же позиции. Что можно использовать для этого?

1 Ответ

0 голосов
/ 04 июля 2018

Вы не можете сделать это с включенным переводом новой строки (то, что Стандарт называет «текстовым режимом»), потому что поиск назад в позиции требует, чтобы стандартная библиотека просканировала всю переднюю часть файла, чтобы найти N символов, а не символов. двойной подсчет-символы новой строки. Переводы кодировок переменной длины (например, между UTF-8 и UCS) вызывают аналогичную проблему.

Решение состоит в том, чтобы отключить перевод новой строки (то, что Стандарт называет «двоичным режимом») и любые другие переводы, которые включают в себя кодирование переменной длины, и обрабатывать их самостоятельно. Когда все переводы отключены, «позиция файла» - это число, непосредственно используемое ОС для выполнения файлового ввода-вывода, и, следовательно, может быть очень эффективным (зависит от того, действительно ли оно эффективно, зависит от деталей реализации стандартной библиотеки).

...