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?

Foi útil?

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.

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