C ++ Come leggere oggetti con un determinato offset?
-
20-08-2019 - |
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?
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.