Вопрос

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

Вопрос в том,:параметры таких функций, как 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top