C ++ Wie in Objekten mit einem bestimmten Offset zu lesen?
-
20-08-2019 - |
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?
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.