Domanda

Ora ho un file con molti dati al suo interno. E so che i dati di cui ho bisogno iniziano nella posizione (lunga) x e hanno una dimensione data di (y) Come posso ottenere questi dati?

È stato utile?

Soluzione

Utilizza il metodo seek:

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

Altri suggerimenti

Dovresti usare fseek () per cambiare il tuo " posizione attuale " nel file fino all'offset desiderato. Quindi, se & Quot; f & Quot; è la tua variabile FILE * e offset è l'offset, ecco come dovrebbe apparire la chiamata (modulo my leaky memory):

fseek(f, offset, SEEK_SET);

Oltre alle solite tecniche di ricerca e lettura menzionate sopra, puoi anche mappare il file nello spazio del tuo processo usando qualcosa come mmap () e accedi direttamente ai dati.

Ad esempio, dato il seguente file di dati " foo.dat " ;:

one two three

Il seguente codice stamperà tutto il testo dopo i primi quattro byte utilizzando un mmap () approccio basato:

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

Puoi persino usare questo approccio per scrivere direttamente su un file (ricorda di msync () se necessario).

Librerie come Boost e ACE forniscono incapsulamenti C ++ piacevoli per mmap () (e la funzione Windows equivalente).

Questo approccio è probabilmente eccessivo per file di piccole dimensioni, ma può essere un'enorme vittoria per file di grandi dimensioni. Come al solito, profila il tuo codice per determinare quale approccio è il migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top