Question

Maintenant, j'ai un fichier contenant de nombreuses données. Et je sais que les données dont j'ai besoin commencent à la position (long) x et ont une taille donnée sizeof (y) Comment puis-je obtenir ces données?

Était-ce utile?

La solution

Utilisez la seek méthode:

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

Autres conseils

Vous devez utiliser fseek () pour changer votre " position actuelle " dans le fichier au décalage souhaité. Donc, si & Quot; f & Quot; est votre variable FILE * et offset est le décalage, voici à quoi devrait ressembler l'appel (modulo my leaky memory):

fseek(f, offset, SEEK_SET);

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

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

one two three

Le code suivant imprimera tout le texte après les quatre premiers octets en utilisant un mmap Approche basée sur () :

#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).

Des bibliothèques telles que 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 très avantageuse pour les gros fichiers. Comme d'habitude, profilez votre code pour déterminer la meilleure approche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top