2009-06-26 6 views
4

Maintenant, j'ai un fichier avec beaucoup de données. Et je sais que les données dont j'ai besoin commencent à position (long) x et ont une taille donnée sizeof (y) Comment puis-je obtenir ces données?C++ Comment lire des objets avec un décalage donné?

+0

@shevron, ces objets sont-ils conservés sur le disque? Ou juste un fichier contenant des données que vous voulez lire? –

Répondre

8

Utilisez la méthode seek:

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

Vous devez utiliser fseek() pour modifier votre "position actuelle" dans le fichier au décalage souhaité. Donc, si « f » est votre fichier variable * et le décalage est le décalage c'est de savoir comment l'appel devrait ressembler (modulo ma mémoire qui fuit):

fseek(f, offset, SEEK_SET); 
+0

ajouter un fread pour la partie "comment puis-je obtenir ces données". – Tom

2

Outre les techniques habituelles de recherche et de lecture mentionnées ci-dessus, vous pouvez également mapper le fichier dans votre espace de processus en utilisant quelque chose comme mmap() et accéder directement aux données.

Par exemple, étant donné le fichier de données suivantes "de foo.dat":

one two three 

Le code suivant imprime tout le texte après les quatre premiers octets en utilisant une approche basée mmap():

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

Vous pouvez même utiliser cette approche pour écrire directement dans un fichier (n'oubliez pas de msync() si nécessaire).

Les bibliothèques comme Boost et ACE fournissent de belles encapsulations C++ pour mmap() (et la fonction Windows équivalente).

Cette approche est probablement excessive pour les petits fichiers, mais elle peut être énorme pour les gros fichiers. Comme d'habitude, profilez votre code pour déterminer quelle approche est la meilleure.

Questions connexes