Pregunta

Ahora tengo un archivo con muchos datos. Y sé que los datos que necesito comienzan en la posición (larga) x y tienen un tamaño de tamaño dado de (y) ¿Cómo puedo obtener estos datos?

¿Fue útil?

Solución

Use el método seek:

ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);

Otros consejos

Debe usar fseek () para cambiar su " posición actual " en el archivo al desplazamiento deseado. Entonces, si & Quot; f & Quot; es su variable ARCHIVO * y el desplazamiento es el desplazamiento así es como debería verse la llamada (módulo mi memoria con fugas):

fseek(f, offset, SEEK_SET);

Además de las técnicas habituales de búsqueda y lectura mencionadas anteriormente, también puede asignar el archivo a su espacio de proceso utilizando algo como mmap () y acceda a los datos directamente.

Por ejemplo, dado el siguiente archivo de datos " foo.dat " ;:

one two three

El siguiente código imprimirá todo el texto después de los primeros cuatro bytes usando un mmap () enfoque basado:

#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;
}

Incluso puede usar este enfoque para escribir directamente en un archivo (recuerde msync () si es necesario).

Las bibliotecas como Boost y ACE proporcionan buenas encapsulaciones en C ++ para mmap () (y la función equivalente de Windows).

Este enfoque es probablemente excesivo para archivos pequeños, pero puede ser una gran victoria para archivos grandes. Como de costumbre, perfile su código para determinar qué enfoque es mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top