Frage

Jetzt habe ich eine Datei mit vielen Daten enthalten. Und ich weiß, dass die Daten, die ich brauche beginnt an Position (long) x und hat eine bestimmte Größe sizeof (y) Wie kann ich diese Daten?

War es hilfreich?

Lösung

Mit der seek Methode:

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

Andere Tipps

Sie sollten verwenden fseek () Ihre „aktuelle Position“, um die in der Datei gewünschten Versatz 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 Speichers):

fseek(f, offset, SEEK_SET);

Neben den üblichen suchen-und-Lesetechniken, die oben erwähnt, können Sie die Datei auch in Ihren Prozessraum Karte etwas mit wie mmap () und Zugriff auf die Daten direkt an.

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

one two three

Der folgende Code wird den gesamten Text nach den ersten vier Bytes drucken mit einem mmap () basierten Ansatz:

#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 auch diesen Ansatz verwenden, um direkt in eine Datei zu schreiben (Sie erinnern sich an msync () falls erforderlich).

Bibliotheken wie Boost und ACE schön C ++ Verkapselungen für mmap liefern () (und die entsprechende Windows-Funktion).

Dieser Ansatz ist wahrscheinlich übertrieben für kleine Dateien, aber es kann großer Gewinn für große Dateien sein. Wie üblich Profil Code, welcher Ansatz zu bestimmen, ist am besten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top