Вопрос о позиции поиска файла

Мой предыдущий Вопрос о чтении и записи необработанных данных, но возникла новая проблема, кажется, что нет конца....

Вопрос такой: параметры функций типа lseek() или fseek() все 4 байта. Если я хочу переместить диапазон через 4G, это невозможно. Я знаю, что в Win32 есть функция SetPointer(...,Hign, Low,....), эти указатели могут генерировать 64-байтовые указатели, чего я и хочу.

Но если я хочу создать приложение в Linux или Unix (создать файл или напрямую записать необработанные сектора диска), как я могу перейти к указателю через 4G?

Сэнкс, жду ваших ответов...


person Shaobo Wang    schedule 06.11.2009    source источник


Ответы (3)


Параметр смещения lseek имеет тип off_t. В 32-битных средах компиляции этот тип по умолчанию представляет собой 32-битное целое число со знаком, однако, если вы компилируете этот макрос, определенный до того, как вся система включает:

#define _FILE_OFFSET_BITS 64

...тогда off_t будет 64-битным подписанным типом.

Для fseek функция fseeko идентична, за исключением того, что она использует тип off_t для смещения, что позволяет приведенному выше решению работать и с ней.

person caf    schedule 06.11.2009
comment
где исходное определение _FILE_OFFSET_BITS в окнах - person Shaobo Wang; 11.11.2009
comment
@Macroideal: вы сами должны #define _FILE_OFFSET_BITS в вашем файле .c до любых #includes. - person Thomas Padron-McCarthy; 11.11.2009
comment
Ну, @caf дает ТОЧНЫЙ ответ. Для этого вы можете добавить -D_LARGEFILE_SOURCE, -D_LARGEFILE64_SOURCE или -D_FILE_OFFSET_BITS=64 в CFLAGS/XXFLAGS любых параметров Makefile или компилятора по умолчанию. - person Test; 15.11.2009

4-байтовое целое число без знака может представлять значение до 4294967295, что означает, что если вы хотите переместить более 4G, вам нужно использовать lseek64(). Кроме того, вы можете использовать fgetpos() и fsetpos() для изменения позиции в файле.

person Matt    schedule 06.11.2009
comment
Как я могу использовать функцию lseek64() в Linux и Windows, в Linux нужно ли мне включать некоторые библиотеки при ее компиляции - person Shaobo Wang; 11.11.2009
comment
lseek64() — это функция, определенная POSIX, поэтому она доступна только в системах с API POSIX. Он доступен в glibc (начиная с версии 2.1), однако для glibc вам необходимо включить определение #define _LARGEFILE64_SOURCE, чтобы он был доступен. - person Matt; 12.11.2009
comment
просто отработайте различия, установив макрос и #if в исходном коде и создав заголовок конфигурации. - person RageZ; 13.11.2009

В Windows используйте _lseeki64(), в Linux , lseek64().

Я рекомендую использовать lseek64() в обеих системах, выполнив что-то вроде этого:

#ifdef _WIN32
#include <io.h>
#define lseek64 _lseeki64
#else
#include <unistd.h>
#endif

Это все, что вам нужно.

person Matt Joiner    schedule 14.11.2009