2009-06-26 4 views
4

Jetzt habe ich eine Datei mit vielen Daten drin. Und ich weiß, dass die Daten, die ich brauche, an Position (lang) x beginnt und eine gegebene Größe hat sizeof (y) Wie kann ich diese Daten bekommen?C++ Wie lese ich Objekte mit einem bestimmten Offset ein?

+0

@shevron, sind diese Objekte auf der Festplatte gespeichert? Oder nur eine Datei mit einigen Daten, die Sie einlesen möchten? –

Antwort

8

Verwenden Sie die seek Methode:

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

Sie sollten fseek() verwenden, um Ihre "aktuelle Position" in der Datei auf den gewünschten Offset zu ändern. Also, wenn "f" Ihre FILE * variabel ist und Offset ist der Offset dies ist, wie der Aufruf sollte wie folgt aussehen (Modulo meinen undichten Speicher):

fseek(f, offset, SEEK_SET); 
+0

fügen Sie ein fread für den "wie kann ich diese Daten" Teil. – Tom

2

Neben den oben genannten Such- und Lesetechniken können Sie die Datei auch in Ihren Prozessbereich unter Verwendung von etwa mmap() abbilden und direkt auf die Daten zugreifen.

Zum Beispiel angesichts der folgenden Datendatei "foo.dat":

one two three 

Der folgende Code wird den gesamten Text nach den ersten vier Bytes unter Verwendung eines mmap() basierten Ansatz drucken:

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

Sie können diesen Ansatz sogar verwenden, um direkt in eine Datei zu schreiben (denken Sie bei Bedarf an msync()).

Bibliotheken wie Boost und ACE bieten nette C++ - Verkapselungen für mmap() (und die entsprechende Windows-Funktion).

Dieser Ansatz ist wahrscheinlich zu klein für kleine Dateien, aber es kann ein großer Gewinn für große Dateien sein. Wie üblich, profilieren Sie Ihren Code, um festzustellen, welcher Ansatz der beste ist.