C ++ Como ler em objetos com um dado offset?
-
20-08-2019 - |
Pergunta
Agora eu tenho um arquivo com muitos dados nele. E eu sei que a necessidade de dados que começa na posição (comprimento) x e tem um determinado tamanho sizeof (y) Como posso obter esses dados?
Solução
Use o método seek
:
ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);
Outras dicas
Você deve usar fseek () para alterar a sua "posição atual" no arquivo para o offset desejado. Então, se "f" é a sua FILE * variável e deslocamento é a este deslocamento é como a chamada deve ser semelhante (modulo minha memória com vazamento):
fseek(f, offset, SEEK_SET);
Além do costume de procurar e ler técnicas mencionadas acima, você pode também mapear o arquivo em seu espaço de processo usando algo como mmap () e acessar os dados diretamente.
Por exemplo, dado o seguinte arquivo de dados "foo.dat":
one two three
O código a seguir irá imprimir todo o texto após os primeiros quatro bytes usando um mmap () abordagem baseada:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main()
{
int result = -1;
int const fd = open("foo.dat", O_RDONLY);
struct stat s;
if (fd != -1 && fstat(fd, &s) == 0)
{
void * const addr = mmap(0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr != MAP_FAILED)
{
char const * const text = static_cast<char *>(addr);
// Print all text after the first 4 bytes.
std::cout << text + 4 << std::endl;
munmap(addr, s.st_size);
result = 0;
}
close(fd);
}
return result;
}
Você pode até mesmo usar essa abordagem para escrever diretamente para um arquivo (lembre-se msync () se necessário).
Bibliotecas como Boost e ACE fornecer encapsulamentos agradáveis ??C ++ para mmap () (e a função equivalente Windows).
Esta abordagem é provavelmente um exagero para arquivos pequenos, mas pode ser grande vitória para arquivos grandes. Como de costume, o perfil de seu código para determinar qual é a melhor abordagem.