Вопрос о позиции для поиска файла
Вопрос
Мой предыдущий вопрос касался чтения и записи необработанных данных, но возникла новая проблема, похоже, этому нет конца....
Вопрос в том,:параметры таких функций, как lseek()
или fseek()
всего это 4 байта.Если я хочу переместить диапазон через 4G, это невозможно.Я знаю, что в Win32 есть функция SetPointer(...,Hign, Low,....)
, эти указатели могут генерировать 64-байтовые указатели, чего я и хочу.
Но если я хочу создать приложение в Linux или Unix (создать файл или напрямую записать необработанные сектора диска), как я могу перейти к указателю через 4G?
Спасибо, Жду ваших ответов...
Решение
Параметр смещения lseek
относится к типу off_t
.В 32-разрядных средах компиляции этот тип по умолчанию равен 32-разрядному целому числу со знаком - однако, если вы компилируете с помощью этого макроса, определенного до включения all system:
#define _FILE_OFFSET_BITS 64
...затем off_t
будет иметь 64-разрядный подписанный тип.
Для fseek
, тот самый fseeko
функция идентична, за исключением того, что она использует off_t
введите значение смещения, что позволяет вышеупомянутому решению работать и с ним.
Другие советы
4-байтовое целое число без знака может представлять значение до 4294967295, что означает, что если вы хотите переместить больше 4G, вам нужно использовать lseek64().Кроме того, вы можете использовать fgetpos() и fsetpos() для изменения позиции в файле.
В Windows используйте _lseeki64()
, в Linux, lseek64()
.
Я рекомендую использовать lseek64()
в обеих системах, выполнив что-то вроде этого:
#ifdef _WIN32
#include <io.h>
#define lseek64 _lseeki64
#else
#include <unistd.h>
#endif
Это все, что вам нужно.