Pergunta

A minha pergunta anterior é sobre dados brutos leitura e escrita, mas um novo problema arised, parece que não há nenhum término ....

A questão é: os parâmetros das funções como lseek() ou fseek() são todos os 4 bytes. Se eu quiser mover uma extensão mais de 4G, que é imposible. Eu sei que no Win32, existe uma função SetPointer(...,Hign, Low,....), este ponteiros pode gerar 64 ponteiros de bytes, que é o que eu quero.

Mas se eu quero criar um aplicativo no Linux ou Unix (criar um arquivo ou diretamente write os setores da unidade matérias), Como posso mudar para um ponteiro sobre 4G?

Thanx, esperando por suas respostas ...

Foi útil?

Solução

O parâmetro deslocamento de lseek é do tipo off_t. Em ambientes de compilação de 32 bits, este tipo padrão é um inteiro assinado de 32 bits - no entanto, se você compilar com este macro definido antes de todo o sistema inclui:

#define _FILE_OFFSET_BITS 64

... então off_t será um tipo assinado de 64 bits.

Para fseek, a função fseeko é idêntico, exceto que ele usa o tipo de off_t para o deslocamento, o que permite que a solução acima para o trabalho com ele também.

Outras dicas

a não assinado inteiro de 4 byte pode representar um valor até 4294967295, que significa que se você deseja mover mais de 4G, você precisa usar lseek64 (). Além disso, você pode usar fgetpos () e fsetpos () para alterar a posição no arquivo.

No Windows, use _lseeki64() , no Linux, lseek64() .

Eu recomendo usar lseek64() em ambos os sistemas, fazendo algo parecido com isto:

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

Isso é tudo que você precisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top