Вычисление смещения файла после записи - PullRequest
0 голосов
/ 26 июня 2011

Я пишу программу, в которой я записываю все записи в файл, и непосредственно перед завершением процесса я записываю все записи на месте, т.е. из журнала в фактический файл. Теперь в журнале каждой записи типа что-то вроде:

 offset, length, data

После записи мне нужно вычислить смещение, чтобы я мог искать эту позицию, когда я наконец записываю в фактический файл, чтобы записать следующую запись или для чтения.

Будет ли текущая позиция смещения + записанные байты давать мне смещение файла после записи.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 июня 2011

Используйте fgetpos для получения смещения файла и fsetpos для установки смещения файла.

0 голосов
/ 17 февраля 2014

Есть несколько способов добиться этого:

  1. Первый путь (В этом случае позиция будет автоматически обновляться до того, сколько вы прочитали.)

    1. Считывание всего содержимого журнала в память
    2. Сортировка по возрастанию (смещение + длина)
    3. Использование последовательных вызовов чтения
  2. Второй способ (наиболее переносимый)

    1. Использование fgetpos (), fgetpos64 () и fsetpos (), fsetpos64 () набор функций.
  3. Третий путь

    1. Использование ftello (), fseeko () и ftello64 ​​(), fseeko64 () набор функций.
  4. Четвертый путь (менее переносимый)

    1. Использование ftell (), fseek () и ftell64 (), fseek64 () набор функций.

Разница между func () и func64 () в том, что func64 () использует правильное 64-битное смещение, чтоустраняет проблему с файлами более 4 Гб, в то время как func () использует тип int , который может быть 32 или 64 бит, в зависимости от архитектуры.

fseeko () и ftello () функции идентичны fseek () и ftell () за исключением того, что смещает аргумент fseeko () иВозвращаемое значение ftello () имеет тип off _t вместо long .

В качестве заключения рекомендуется использовать fgetpos64 () / fsetpos64 () илиftello64 ​​() / fseeko64 ().Насколько это возможно, старайтесь избегать использования ftell () и fseek ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...